Mike Cui
2011-04-11 10:34:10 UTC
I'm also seeing an infinite loop in evmap_io_active:
TAILQ_FOREACH(ev, &ctx->events, ev_io_next) {
if (ev->ev_events & events)
event_active_nolock(ev, ev->ev_events & events, 1);
}
It looks like the ev_io_next pointer points back to itself :(
Here is a disassembly of that loop:
0x280ab670 <evmap_io_active+64>: mov 0x20(%esi),%esi
0x280ab673 <evmap_io_active+67>: test %esi,%esi
0x280ab675 <evmap_io_active+69>: je 0x280ab69d <evmap_io_active+109>
0x280ab677 <evmap_io_active+71>: mov 0x30(%esi),%eax
0x280ab67a <evmap_io_active+74>: and %edi,%eax
0x280ab67c <evmap_io_active+76>: cwtl
0x280ab67d <evmap_io_active+77>: test %eax,%eax
0x280ab67f <evmap_io_active+79>: je 0x280ab670 <evmap_io_active+64>
And here is what I see from GDB (%esi points to ev, and (%esi + 0x20)
is ev_io_next):
(gdb) p/x $esi
$2 = 0x2835fad0
(gdb) p/x *(void **)($esi + 0x20)
$3 = 0x2835fad0
I guess that would happen if I added the same event twice? But I'm not
doing that. Here is the pattern of event_add() and event_callbacks()
for each fd and struct ev * that I add. I'm adding events as EV_READ
or EV_WRITE, not EV_PERSIST, and with no timeout:
event_add(fd=9, ev=0x2831fec0)
event_callback(fd=9, ev=0x2831fec0)
event_add(fd=9, ev=0x2831fec0)
event_add(fd=11, ev=0x2833dcd0)
event_callback(fd=11, ev=0x2833dcd0)
event_add(fd=11, ev=0x2835fad0)
event_add(fd=10, ev=0x2833da80)
event_callback(fd=10, ev=0x2833da80)
event_add(fd=10, ev=0x2833da80)
event_callback(fd=11, ev=0x2835fad0)
event_add(fd=11, ev=0x2835fad0)
What am I doing wrong here? The only thing I can think of is that it
might not be OK to re-add the same event in the callback? But I copied
this code right out of event-test.c.
My program is single threaded, and I can deterministically get it
stuck in this state immediately using just one connection.
Thanks for your help!
***********************************************************************
To unsubscribe, send an e-mail to ***@freehaven.net with
unsubscribe libevent-users in the body.
TAILQ_FOREACH(ev, &ctx->events, ev_io_next) {
if (ev->ev_events & events)
event_active_nolock(ev, ev->ev_events & events, 1);
}
It looks like the ev_io_next pointer points back to itself :(
Here is a disassembly of that loop:
0x280ab670 <evmap_io_active+64>: mov 0x20(%esi),%esi
0x280ab673 <evmap_io_active+67>: test %esi,%esi
0x280ab675 <evmap_io_active+69>: je 0x280ab69d <evmap_io_active+109>
0x280ab677 <evmap_io_active+71>: mov 0x30(%esi),%eax
0x280ab67a <evmap_io_active+74>: and %edi,%eax
0x280ab67c <evmap_io_active+76>: cwtl
0x280ab67d <evmap_io_active+77>: test %eax,%eax
0x280ab67f <evmap_io_active+79>: je 0x280ab670 <evmap_io_active+64>
And here is what I see from GDB (%esi points to ev, and (%esi + 0x20)
is ev_io_next):
(gdb) p/x $esi
$2 = 0x2835fad0
(gdb) p/x *(void **)($esi + 0x20)
$3 = 0x2835fad0
I guess that would happen if I added the same event twice? But I'm not
doing that. Here is the pattern of event_add() and event_callbacks()
for each fd and struct ev * that I add. I'm adding events as EV_READ
or EV_WRITE, not EV_PERSIST, and with no timeout:
event_add(fd=9, ev=0x2831fec0)
event_callback(fd=9, ev=0x2831fec0)
event_add(fd=9, ev=0x2831fec0)
event_add(fd=11, ev=0x2833dcd0)
event_callback(fd=11, ev=0x2833dcd0)
event_add(fd=11, ev=0x2835fad0)
event_add(fd=10, ev=0x2833da80)
event_callback(fd=10, ev=0x2833da80)
event_add(fd=10, ev=0x2833da80)
event_callback(fd=11, ev=0x2835fad0)
event_add(fd=11, ev=0x2835fad0)
What am I doing wrong here? The only thing I can think of is that it
might not be OK to re-add the same event in the callback? But I copied
this code right out of event-test.c.
My program is single threaded, and I can deterministically get it
stuck in this state immediately using just one connection.
Thanks for your help!
***********************************************************************
To unsubscribe, send an e-mail to ***@freehaven.net with
unsubscribe libevent-users in the body.