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.44Fax : +33 (0)3.20.61.97.48
smime.p7s
Description: S/MIME Cryptographic Signature
_______________________________________________ Libevent-users mailing list Libevent-users@monkey.org http://monkeymail.org/mailman/listinfo/libevent-users