I'm willing to post code snippets if it helps.

What I'm seeing is that after some time adding just 1 event causes an
infinite loop in evmap_io_active, and I can't figure out if I'm doing
anything wrong, and why the code would work for some time then go crazy.

Thanks

Sherif

On Sun, Apr 10, 2011 at 11:56 AM, Sherif Fanous <sherif.fan...@gmail.com>wrote:

> Ok I managed to get some more info
>
> It deadlocked and this is what I got in my log file
>
> 10/04/11 11:27:09  1466 3035069296 1 events are added to the send event
> base
> 10/04/11 11:27:09  1425 3068124016 Dispatching send event base
> 10/04/11 11:27:09  1425 3068124016 Starting loop for base 0x8808ad0
> 10/04/11 11:27:09  1425 3068124016 base: 0x8808ad0, ev: 0xb13f00f8
> 10/04/11 11:27:09  1425 3068124016 base: 0x8808ad0, ev: 0xb13f00f8
>
> The last line repeats to infinity.
>
> On Sun, Apr 10, 2011 at 11:00 AM, Sherif Fanous 
> <sherif.fan...@gmail.com>wrote:
>
>> Sorry about the late reply.
>>
>> I'm not very good with gdb. Actually I'm just a beginner with gdb.
>>
>> To generate the above trace I first waited for a deadlock to occur. I then
>> killed the process using "kill -6 <pid>" to force the process to dump core.
>> I then opened the core file using gdb and ran the command "thread apply all
>> where"
>>
>> I'll try to figure out how it's done, if not I'll just add some log
>> messages to evmap.c to log the values of base & ev on each loop and just
>> use event_set_log_callback to log this to a file :S
>>
>> Thanks
>>
>> Sherif
>>
>> On Sat, Apr 9, 2011 at 2:58 PM, Nick Mathewson <ni...@freehaven.net>wrote:
>>
>>> On Sat, Apr 9, 2011 at 4:16 AM, Sherif Fanous <sherif.fan...@gmail.com>
>>> wrote:
>>> > As a matter of fact, the thread in question is usually stuck in
>>> > event_active_nolock.
>>> > The funny thing is that it shows that it's stuck in line 2212 in
>>> event.c
>>> > which is the opening brace of the function.
>>> > How would I walk through ctx->events?
>>>
>>> So, having a look at the TAILQ_FOREACH definition, it's going to unpack
>>> to:
>>>
>>>    for (ev = TAILQ_FIRST(&ctx->events);
>>>        ev != TALQ_END(&ctx->events);
>>>        ev = TAILQ_NEXT(ev, ev_io_next) {
>>>
>>> and that's going to turn into:
>>>
>>>    for (ev = ctx->events.tqh_first;
>>>        ev != NULL;
>>>        ev = ev->ev_io_next.tqe_next) {
>>>
>>> So, given those stack traces, I assume you're using gdb.  Start with
>>> ctx->events.tqh_first, then look at the ev_io_next.tqe_next field of
>>> that, then the ev_io_next.tqe_next field of that, etc, until you get a
>>> repeat or a NULL or something that looks crazy.
>>>
>>> hth,
>>> --
>>> Nick
>>>
>>
>>
>

Reply via email to