X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/c04c7d0577ceddfe470b6fdcaf727ced91a67d1a..aa07e8dd0ad9aa9952a6eeba2ef2b15429c08831:/ev.c diff --git a/ev.c b/ev.c index 83c643a..9ef3d13 100644 --- a/ev.c +++ b/ev.c @@ -94,6 +94,14 @@ # define EV_USE_KQUEUE 0 #endif +#ifndef EV_USE_WIN32 +# ifdef WIN32 +# define EV_USE_WIN32 1 +# else +# define EV_USE_WIN32 0 +# endif +#endif + #ifndef EV_USE_REALTIME # define EV_USE_REALTIME 1 #endif @@ -226,6 +234,9 @@ ev_now (EV_P) cur = newcnt; \ } +#define array_free(stem, idx) \ + free (stem ## s idx); stem ## cnt idx = stem ## max idx = 0; + /*****************************************************************************/ static void @@ -300,11 +311,8 @@ fd_reify (EV_P) anfd->reify = 0; - if (anfd->events != events) - { - method_modify (EV_A_ fd, anfd->events, events); - anfd->events = events; - } + method_modify (EV_A_ fd, anfd->events, events); + anfd->events = events; } fdchangecnt = 0; @@ -351,9 +359,9 @@ fd_ebadf (EV_P) static void fd_enomem (EV_P) { - int fd = anfdmax; + int fd; - while (fd--) + for (fd = anfdmax; fd--; ) if (anfds [fd].events) { close (fd); @@ -387,12 +395,12 @@ upheap (WT *heap, int k) while (k && heap [k >> 1]->at > w->at) { heap [k] = heap [k >> 1]; - heap [k]->active = k + 1; + ((W)heap [k])->active = k + 1; k >>= 1; } heap [k] = w; - heap [k]->active = k + 1; + ((W)heap [k])->active = k + 1; } @@ -412,12 +420,12 @@ downheap (WT *heap, int N, int k) break; heap [k] = heap [j]; - heap [k]->active = k + 1; + ((W)heap [k])->active = k + 1; k = j; } heap [k] = w; - heap [k]->active = k + 1; + ((W)heap [k])->active = k + 1; } /*****************************************************************************/ @@ -516,9 +524,9 @@ child_reap (EV_P_ struct ev_signal *sw, int chain, int pid, int status) for (w = (struct ev_child *)childs [chain & (PID_HASHSIZE - 1)]; w; w = (struct ev_child *)((WL)w)->next) if (w->pid == pid || !w->pid) { - w->priority = sw->priority; /* need to do it *now* */ - w->rpid = pid; - w->rstatus = status; + ev_priority (w) = ev_priority (sw); /* need to do it *now* */ + w->rpid = pid; + w->rstatus = status; event (EV_A_ (W)w, EV_CHILD); } } @@ -610,6 +618,9 @@ loop_init (EV_P_ int methods) methods = EVMETHOD_ANY; method = 0; +#if EV_USE_WIN32 + if (!method && (methods & EVMETHOD_WIN32 )) method = win32_init (EV_A_ methods); +#endif #if EV_USE_KQUEUE if (!method && (methods & EVMETHOD_KQUEUE)) method = kqueue_init (EV_A_ methods); #endif @@ -628,6 +639,11 @@ loop_init (EV_P_ int methods) void loop_destroy (EV_P) { + int i; + +#if EV_USE_WIN32 + if (method == EVMETHOD_WIN32 ) win32_destroy (EV_A); +#endif #if EV_USE_KQUEUE if (method == EVMETHOD_KQUEUE) kqueue_destroy (EV_A); #endif @@ -641,6 +657,16 @@ loop_destroy (EV_P) if (method == EVMETHOD_SELECT) select_destroy (EV_A); #endif + for (i = NUMPRI; i--; ) + array_free (pending, [i]); + + array_free (fdchange, ); + array_free (timer, ); + array_free (periodic, ); + array_free (idle, ); + array_free (prepare, ); + array_free (check, ); + method = 0; /*TODO*/ } @@ -784,7 +810,8 @@ call_pending (EV_P) if (p->w) { p->w->pending = 0; - p->w->cb (EV_A_ p->w, p->events); + + ((void (*)(EV_P_ W, int))p->w->cb) (EV_A_ p->w, p->events); } } } @@ -792,7 +819,7 @@ call_pending (EV_P) static void timers_reify (EV_P) { - while (timercnt && timers [0]->at <= mn_now) + while (timercnt && ((WT)timers [0])->at <= mn_now) { struct ev_timer *w = timers [0]; @@ -802,7 +829,7 @@ timers_reify (EV_P) if (w->repeat) { assert (("negative ev_timer repeat value found while processing timers", w->repeat > 0.)); - w->at = mn_now + w->repeat; + ((WT)w)->at = mn_now + w->repeat; downheap ((WT *)timers, timercnt, 0); } else @@ -815,7 +842,7 @@ timers_reify (EV_P) static void periodics_reify (EV_P) { - while (periodiccnt && periodics [0]->at <= rt_now) + while (periodiccnt && ((WT)periodics [0])->at <= rt_now) { struct ev_periodic *w = periodics [0]; @@ -824,8 +851,8 @@ periodics_reify (EV_P) /* first reschedule or stop timer */ if (w->interval) { - w->at += floor ((rt_now - w->at) / w->interval + 1.) * w->interval; - assert (("ev_periodic timeout in the past detected while processing timers, negative interval?", w->at > rt_now)); + ((WT)w)->at += floor ((rt_now - ((WT)w)->at) / w->interval + 1.) * w->interval; + assert (("ev_periodic timeout in the past detected while processing timers, negative interval?", ((WT)w)->at > rt_now)); downheap ((WT *)periodics, periodiccnt, 0); } else @@ -847,7 +874,7 @@ periodics_reschedule (EV_P) if (w->interval) { - ev_tstamp diff = ceil ((rt_now - w->at) / w->interval) * w->interval; + ev_tstamp diff = ceil ((rt_now - ((WT)w)->at) / w->interval) * w->interval; if (fabs (diff) >= 1e-4) { @@ -918,7 +945,7 @@ time_update (EV_P) /* adjust timers. this is easy, as the offset is the same for all */ for (i = 0; i < timercnt; ++i) - timers [i]->at += rt_now - mn_now; + ((WT)timers [i])->at += rt_now - mn_now; } mn_now = rt_now; @@ -979,13 +1006,13 @@ ev_loop (EV_P_ int flags) if (timercnt) { - ev_tstamp to = timers [0]->at - mn_now + method_fudge; + ev_tstamp to = ((WT)timers [0])->at - mn_now + method_fudge; if (block > to) block = to; } if (periodiccnt) { - ev_tstamp to = periodics [0]->at - rt_now + method_fudge; + ev_tstamp to = ((WT)periodics [0])->at - rt_now + method_fudge; if (block > to) block = to; } @@ -1112,7 +1139,7 @@ ev_timer_start (EV_P_ struct ev_timer *w) if (ev_is_active (w)) return; - w->at += mn_now; + ((WT)w)->at += mn_now; assert (("ev_timer_start called with negative timer repeat value", w->repeat >= 0.)); @@ -1120,6 +1147,8 @@ ev_timer_start (EV_P_ struct ev_timer *w) array_needsize (timers, timermax, timercnt, ); timers [timercnt - 1] = w; upheap ((WT *)timers, timercnt - 1); + + assert (("internal timer heap corruption", timers [((W)w)->active - 1] == w)); } void @@ -1129,13 +1158,15 @@ ev_timer_stop (EV_P_ struct ev_timer *w) if (!ev_is_active (w)) return; - if (w->active < timercnt--) + assert (("internal timer heap corruption", timers [((W)w)->active - 1] == w)); + + if (((W)w)->active < timercnt--) { - timers [w->active - 1] = timers [timercnt]; - downheap ((WT *)timers, timercnt, w->active - 1); + timers [((W)w)->active - 1] = timers [timercnt]; + downheap ((WT *)timers, timercnt, ((W)w)->active - 1); } - w->at = w->repeat; + ((WT)w)->at = w->repeat; ev_stop (EV_A_ (W)w); } @@ -1147,8 +1178,8 @@ ev_timer_again (EV_P_ struct ev_timer *w) { if (w->repeat) { - w->at = mn_now + w->repeat; - downheap ((WT *)timers, timercnt, w->active - 1); + ((WT)w)->at = mn_now + w->repeat; + downheap ((WT *)timers, timercnt, ((W)w)->active - 1); } else ev_timer_stop (EV_A_ w); @@ -1167,12 +1198,14 @@ ev_periodic_start (EV_P_ struct ev_periodic *w) /* this formula differs from the one in periodic_reify because we do not always round up */ if (w->interval) - w->at += ceil ((rt_now - w->at) / w->interval) * w->interval; + ((WT)w)->at += ceil ((rt_now - ((WT)w)->at) / w->interval) * w->interval; ev_start (EV_A_ (W)w, ++periodiccnt); array_needsize (periodics, periodicmax, periodiccnt, ); periodics [periodiccnt - 1] = w; upheap ((WT *)periodics, periodiccnt - 1); + + assert (("internal periodic heap corruption", periodics [((W)w)->active - 1] == w)); } void @@ -1182,10 +1215,12 @@ ev_periodic_stop (EV_P_ struct ev_periodic *w) if (!ev_is_active (w)) return; - if (w->active < periodiccnt--) + assert (("internal periodic heap corruption", periodics [((W)w)->active - 1] == w)); + + if (((W)w)->active < periodiccnt--) { - periodics [w->active - 1] = periodics [periodiccnt]; - downheap ((WT *)periodics, periodiccnt, w->active - 1); + periodics [((W)w)->active - 1] = periodics [periodiccnt]; + downheap ((WT *)periodics, periodiccnt, ((W)w)->active - 1); } ev_stop (EV_A_ (W)w); @@ -1209,7 +1244,7 @@ ev_idle_stop (EV_P_ struct ev_idle *w) if (ev_is_active (w)) return; - idles [w->active - 1] = idles [--idlecnt]; + idles [((W)w)->active - 1] = idles [--idlecnt]; ev_stop (EV_A_ (W)w); } @@ -1231,7 +1266,7 @@ ev_prepare_stop (EV_P_ struct ev_prepare *w) if (ev_is_active (w)) return; - prepares [w->active - 1] = prepares [--preparecnt]; + prepares [((W)w)->active - 1] = prepares [--preparecnt]; ev_stop (EV_A_ (W)w); } @@ -1253,7 +1288,7 @@ ev_check_stop (EV_P_ struct ev_check *w) if (ev_is_active (w)) return; - checks [w->active - 1] = checks [--checkcnt]; + checks [((W)w)->active - 1] = checks [--checkcnt]; ev_stop (EV_A_ (W)w); } @@ -1276,7 +1311,7 @@ ev_signal_start (EV_P_ struct ev_signal *w) array_needsize (signals, signalmax, w->signum, signals_init); wlist_add ((WL *)&signals [w->signum - 1].head, (WL)w); - if (!w->next) + if (!((WL)w)->next) { struct sigaction sa; sa.sa_handler = sighandler;