]> granicus.if.org Git - libevent/commitdiff
if a timeout on the active list is rescheduled before it can execute it
authorNiels Provos <provos@gmail.com>
Thu, 10 Apr 2003 19:14:03 +0000 (19:14 +0000)
committerNiels Provos <provos@gmail.com>
Thu, 10 Apr 2003 19:14:03 +0000 (19:14 +0000)
gets removed from the active list;  bug report from Jon Poland AT arbor.net

svn:r65

event.c

diff --git a/event.c b/event.c
index e31e49b603db6729e61bc73e6f11dcb72ace30a2..a25d6e69c2e49af632a639cc8cf6bc53c5ea6b31 100644 (file)
--- a/event.c
+++ b/event.c
@@ -310,6 +310,22 @@ event_add(struct event *ev, struct timeval *tv)
                if (ev->ev_flags & EVLIST_TIMEOUT)
                        event_queue_remove(ev, EVLIST_TIMEOUT);
 
+               /* Check if it is active due to a timeout.  Rescheduling
+                * this timeout before the callback can be executed
+                * removes it from the active list. */
+               if ((ev->ev_flags & EVLIST_ACTIVE) &&
+                   (ev->ev_res & EV_TIMEOUT)) {
+                       /* See if we are just active executing this
+                        * event in a loop
+                        */
+                       if (ev->ev_ncalls && ev->ev_pncalls) {
+                               /* Abort loop */
+                               *ev->ev_pncalls = 0;
+                       }
+                       
+                       event_queue_remove(ev, EVLIST_ACTIVE);
+               }
+
                gettimeofday(&now, NULL);
                timeradd(&now, tv, &ev->ev_timeout);