]> rtime.felk.cvut.cz Git - sojka/libev.git/commitdiff
avoid pendingpri < 0 during ev_run recursion
authorMarc Alexander Lehmann <libev@schmorp.de>
Sat, 2 Jun 2012 11:15:29 +0000 (11:15 +0000)
committerMarc Alexander Lehmann <libev@schmorp.de>
Sat, 2 Jun 2012 11:15:29 +0000 (11:15 +0000)
ev.c

diff --git a/ev.c b/ev.c
index 20bc3b03404982851684348805957c303e5b71b5..52ee05cd7eaa43232ca1b47aedcf046e6c588e98 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -2764,15 +2764,21 @@ ev_pending_count (EV_P) EV_THROW
 void noinline
 ev_invoke_pending (EV_P)
 {
-  for (pendingpri = NUMPRI; pendingpri--; ) /* pendingpri is modified during the loop */
-    while (pendingcnt [pendingpri])
-      {
-        ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri];
+  pendingpri = NUMPRI;
 
-        p->w->pending = 0;
-        EV_CB_INVOKE (p->w, p->events);
-        EV_FREQUENT_CHECK;
-      }
+  while (pendingpri) /* pendingpri possibly gets modified in the inner loop */
+    {
+      --pendingpri;
+
+      while (pendingcnt [pendingpri])
+        {
+          ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri];
+
+          p->w->pending = 0;
+          EV_CB_INVOKE (p->w, p->events);
+          EV_FREQUENT_CHECK;
+        }
+    }
 }
 
 #if EV_IDLE_ENABLE
@@ -3180,10 +3186,6 @@ ev_run (EV_P_ int flags)
   if (loop_done == EVBREAK_ONE)
     loop_done = EVBREAK_CANCEL;
 
-  /* pendingpri is normally -1 here, which is not a good */
-  /* value when returning to an ev_invoke_pending */
-  pendingpri = NUMPRI - 1;
-
 #if EV_FEATURE_API
   --loop_depth;
 #endif