[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [Libevent-users] Signals and priority queues



On Fri, Jan 13, 2012 at 11:46 AM, Ralph Castain <rhc@xxxxxxxxxxxx> wrote:

>> Adding some assertions in event_add_internal might track this down.
>> Trivially, you could do
>>   if (tv && !tv_is_absolute) {
>>       /* waiting one billion seconds should be enough for anyone */
>>       EVUTIL_ASSERT(tv->tv_sec < 1000000000);
>>   }
>>
>> to try to detect 1 and 2.
>
> Interesting. The above code never tripped, so I dug a little further and found that event_add_internal is never being called with a tv value that is large. I did find it to be a race condition - sometimes the  code completes and exits before I get the error condition report.
>
> The timeout value clearly isn't a garbage value - I dumped the values out, compared to current time as of the error:
>
> warn] select: Invalid argument
> TV OUT OF SPEC AT CNT 2: value 1326472513:976848 curtime 1326472513:977043
> Ralph
> [warn] select: Invalid argument
> TV OUT OF SPEC AT CNT 3: value 1326472513:977327 curtime 1326472513:977413
>
> So the value is getting updated and appears valid. What's strange is why libevent is passing an absolute time to select as it is supposed to be a relative value per the man page:

Right.

 [...]
> Any easy way I can output an identifier that would tell us something about which event is involved? I see that I'm not getting output from the event_debug calls in the code, even though I've configured with debug enabled and called:
>
>        event_enable_debug_mode();
>        event_set_debug_output(1);
>
> Anything else required to get that output? Would it help?

Maybe.  I'd look at adding debugging logs or printfs to
event_base_loop and timeout_next() and timeout_correct(): Those are
the ones that determine the value of the timeout to be passed to
evsel->dispatch.  The event that's getting the weird value is set by
        ev = min_heap_top(&base->timeheap);
in timeout_next.
-- 
Nick
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.