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
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