Hi,

I'm using events in 1.4.12-stable.

Sometimes, my daemon, which uses event_base_loop()
goes in an infinite loop ( verbose traces below ).

This infinite loop is inside function event_process_active() which
calls event_del() with ev_flags=0x80 ( =EVLIST_INIT)
This flags is not managed by event_del(), then the ev is never deleted
from the queue, then the loop "for" retries again and again.

static void event_process_active(struct event_base *base)
{
...
     for (ev = TAILQ_FIRST(activeq); ev; ev = TAILQ_FIRST(activeq)) {
             if (ev->ev_events & EV_PERSIST)
                     event_queue_remove(base, ev, EVLIST_ACTIVE);
             else
                     event_del(ev);
...
   }
}


[2009-08-26 17:12:29] ev  : event_add: event: 0xb13a7e0, EV_READ
call 0x280b789c
[2009-08-26 17:12:29] ev  : kq_insert: fd 43 EVFILT_READ
[2009-08-26 17:12:29] ev  : event_queue_insert queue=0x2  ev_flags=0x1082
[2009-08-26 17:12:29] ev  : event_process_active: call event_del
[2009-08-26 17:12:29] ev  : event_del: 0xb13e6a0, callback 0x280b7dd4,
ev_flags 0x1082 ev_events 0x2
[2009-08-26 17:12:29] ev  : event_queue_remove queue=0x2  ev_flags=0x1080
[2009-08-26 17:12:29] ev  : kq_insert: fd 74 EVFILT_READ (del)
[2009-08-26 17:12:29] ev  : event_process_active: call event_del
[2009-08-26 17:12:29] ev  : event_del: 0xb13e6a0, callback 0x280b7dd4,
ev_flags 0x80 ev_events 0x2
[2009-08-26 17:12:29] ev  : event_process_active: call event_del
[2009-08-26 17:12:29] ev  : event_del: 0xb13e6a0, callback 0x280b7dd4,
ev_flags 0x80 ev_events 0x2
[2009-08-26 17:12:29] ev  : event_process_active: call event_del
[2009-08-26 17:12:29] ev  : event_del: 0xb13e6a0, callback 0x280b7dd4,
ev_flags 0x80 ev_events 0x2
[2009-08-26 17:12:29] ev  : event_process_active: call event_del
[2009-08-26 17:12:29] ev  : event_del: 0xb13e6a0, callback 0x280b7dd4,
ev_flags 0x80 ev_events 0x2
[2009-08-26 17:12:29] ev  : event_process_active: call event_del
[2009-08-26 17:12:29] ev  : event_del: 0xb13e6a0, callback 0x280b7dd4,
ev_flags 0x80 ev_events 0x2
.....
....
...
..
.

After investigating my code, I found that I call in this order :

event_set(&ev, EV_READ,callback_one);
event_add(&ev);

and later :
event_set(&ev, EV_READ,callback_two);

The pb is that the second event_set which is called to set another callback resets the ev->flags with EVLIST_INIT
After that I fall into the infinite loop describe behind.

So, even if I'm doing something wrong with the usage of the API, it should not go in an infinite loop.

Finnaly, to prevent to go in the infinite loop ,
do I have to run event_del(&ev) each time before using event_set(&ev) ?

Thank's a lot for your answer.

Nicolas.

--
Nicolas Dumont
System development engineer

NETASQ - We secure IT
3 rue Archimede
59650 Villeneuve d'Ascq
France
Tel :  +33 (0)3.20.61.90.44
Fax : +33 (0)3.20.61.97.48

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkeymail.org/mailman/listinfo/libevent-users

Reply via email to