Solaris crash using port backend

Eric Brown yogieric at gmail.com
Wed Dec 23 02:27:30 CET 2009


Hi,

I've got a libev based application that is crashing on solaris from inside libev about once every 4-days using the port backend (almost like clock work). The same application runs just fine on other platforms. In fact, using the poll() backend, it runs just fine on solaris too. With this particular application, the poll backend is fine as we have very few file handles. However, we have a larger application where port would be much preferred. So eventually it would be nice to resolve this.

It seems like a Solaris bug/issue to me, but it could be my code or libev.

We're running libev 3.7 on a SunOS -s 5.10 Generic_120011-14 sun4u sparc SUNW,Sun-Fire-480R.

abort() is being called from within ev_syserr. I think optimization is on so some routines are hidden, but I believe ev_syserr() is being called from port_poll. It looks like port_getn() is returning -1, but errno is not being set. gdb says errno is 0. Seems unlikely according to the port_getn() man page, but this is what gdb reports:

fd = 0
res = -1
i = 0
ts = {tv_sec = 1, tv_nsec = 0}
errno = 0
loop = {ev_rt_now = 1260880499.7288194, now_floor = 22712836.865228999, mn_now = 22712836.868827399, rtmn_diff = 1238167662.859992, 
  io_blocktime = 0, timeout_blocktime = 0, backend = 32, activecnt = 2, loop_done = 128 '\200', backend_fd = 16, 
  backend_fudge = 0.001, backend_modify = 0x2329c8 <port_modify>, backend_poll = 0x2324f0 <port_poll>, anfds = 0x73dcc0, 
  anfdmax = 32, pendings = {0x0, 0x0, 0x0, 0x5e9750, 0x0}, pendingmax = {0, 0, 0, 2, 0}, pendingcnt = {0, 0, 0, 0, 0}, 
  pending_w = {active = 0, pending = 0, priority = 0, data = 0x0, cb = 0x22d424 <pendingcb>}, rfeeds = 0x0, rfeedmax = 0, 
  rfeedcnt = 0, evpipe = {0, 0}, pipe_w = {active = 0, pending = 0, priority = 2, data = 0x0, cb = 0x22d838 <pipecb>, next = 0x0, 
    fd = 0, events = 0}, curpid = 0, postfork = 0 '\0', vec_ri = 0x0, vec_ro = 0x0, vec_wi = 0x0, vec_wo = 0x0, vec_max = 0, 
  polls = 0x0, pollmax = 0, pollcnt = 0, pollidxs = 0x0, pollidxmax = 0, port_events = 0x7474d0, port_eventmax = 64, 
  fdchanges = 0x70ee18, fdchangemax = 2, fdchangecnt = 0, timers = 0x7478d8, timermax = 4, timercnt = 1, periodics = 0x0, 
  periodicmax = 0, periodiccnt = 0, idles = {0x0, 0x0, 0x0, 0x0, 0x0}, idlemax = {0, 0, 0, 0, 0}, idlecnt = {0, 0, 0, 0, 0}, 
  idleall = 0, prepares = 0x0, preparemax = 0, preparecnt = 0, checks = 0x0, checkmax = 0, checkcnt = 0, forks = 0x0, forkmax = 0, 
  forkcnt = 0, gotasync = 0, asyncs = 0x0, asyncmax = 0, asynccnt = 0, loop_count = 2, loop_depth = 1, userdata = 0x0, 
  release_cb = 0, acquire_cb = 0, invoke_cb = 0x22f0e8 <ev_invoke_pending>}
(gdb) p loop->port_events[0]
$20 = {portev_events = 4, portev_source = 4, portev_pad = 43456, portev_object = 17, portev_user = 0x0}
(gdb) p loop->port_events[1]
$21 = {portev_events = 7401968, portev_source = 0, portev_pad = 0, portev_object = 0, portev_user = 0x0}
(gdb) p loop->port_events[2]
$22 = {portev_events = 0, portev_source = 0, portev_pad = 0, portev_object = 0, portev_user = 0x0}

I don't know port_getn(), but if anybody has suggestions, please let me know.

Thanks,
Eric




More information about the libev mailing list