X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/cf2e067e143e40c3b874a16069773fe04d3737bc..18894ffdcf36dd48598363b9551cc04b1168b3ee:/ev.c diff --git a/ev.c b/ev.c index a605a57..3e008a4 100644 --- a/ev.c +++ b/ev.c @@ -37,23 +37,27 @@ extern "C" { # include "config.h" # if HAVE_CLOCK_GETTIME -# define EV_USE_MONOTONIC 1 -# define EV_USE_REALTIME 1 +# ifndef EV_USE_MONOTONIC +# define EV_USE_MONOTONIC 1 +# endif +# ifndef EV_USE_REALTIME +# define EV_USE_REALTIME 1 +# endif # endif -# if HAVE_SELECT && HAVE_SYS_SELECT_H +# if HAVE_SELECT && HAVE_SYS_SELECT_H && !defined (EV_USE_SELECT) # define EV_USE_SELECT 1 # endif -# if HAVE_POLL && HAVE_POLL_H +# if HAVE_POLL && HAVE_POLL_H && !defined (EV_USE_POLL) # define EV_USE_POLL 1 # endif -# if HAVE_EPOLL && HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H +# if HAVE_EPOLL && HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H && !defined (EV_USE_EPOLL) # define EV_USE_EPOLL 1 # endif -# if HAVE_KQUEUE && HAVE_SYS_EVENT_H && HAVE_SYS_QUEUE_H +# if HAVE_KQUEUE && HAVE_SYS_EVENT_H && HAVE_SYS_QUEUE_H && !defined (EV_USE_KQUEUE) # define EV_USE_KQUEUE 1 # endif @@ -159,7 +163,9 @@ typedef struct ev_watcher_time *WT; static int have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */ -#include "ev_win32.c" +#ifdef WIN32 +# include "ev_win32.c" +#endif /*****************************************************************************/ @@ -251,7 +257,7 @@ typedef struct /*****************************************************************************/ -inline ev_tstamp +ev_tstamp ev_time (void) { #if EV_USE_REALTIME @@ -806,7 +812,9 @@ loop_destroy (EV_P) /* have to use the microsoft-never-gets-it-right macro */ array_free_microshit (fdchange); array_free_microshit (timer); +#if EV_PERIODICS array_free_microshit (periodic); +#endif array_free_microshit (idle); array_free_microshit (prepare); array_free_microshit (check); @@ -1003,6 +1011,7 @@ timers_reify (EV_P) } } +#if EV_PERIODICS static void periodics_reify (EV_P) { @@ -1053,6 +1062,7 @@ periodics_reschedule (EV_P) for (i = periodiccnt >> 1; i--; ) downheap ((WT *)periodics, periodiccnt, i); } +#endif inline int time_update_monotonic (EV_P) @@ -1096,7 +1106,9 @@ time_update (EV_P) now_floor = mn_now; } +# if EV_PERIODICS periodics_reschedule (EV_A); +# endif /* no timer adjustment, as the monotonic clock doesn't jump */ /* timers_reschedule (EV_A_ rtmn_diff - odiff) */ } @@ -1108,7 +1120,9 @@ time_update (EV_P) if (expect_false (mn_now > ev_rt_now || mn_now < ev_rt_now - MAX_BLOCKTIME - MIN_TIMEJUMP)) { +#if EV_PERIODICS periodics_reschedule (EV_A); +#endif /* adjust timers. this is easy, as the offset is the same for all */ for (i = 0; i < timercnt; ++i) @@ -1181,11 +1195,13 @@ ev_loop (EV_P_ int flags) if (block > to) block = to; } +#if EV_PERIODICS if (periodiccnt) { ev_tstamp to = ((WT)periodics [0])->at - ev_rt_now + method_fudge; if (block > to) block = to; } +#endif if (block < 0.) block = 0.; } @@ -1197,7 +1213,9 @@ ev_loop (EV_P_ int flags) /* queue pending timers and reschedule them */ timers_reify (EV_A); /* relative timers called last */ +#if EV_PERIODICS periodics_reify (EV_A); /* absolute timers called first */ +#endif /* queue idle watchers unless io or timers are pending */ if (idlecnt && !any_pending (EV_A)) @@ -1339,7 +1357,7 @@ ev_timer_stop (EV_P_ struct ev_timer *w) downheap ((WT *)timers, timercnt, ((W)w)->active - 1); } - ((WT)w)->at = w->repeat; + ((WT)w)->at -= mn_now; ev_stop (EV_A_ (W)w); } @@ -1358,6 +1376,7 @@ ev_timer_again (EV_P_ struct ev_timer *w) ev_timer_start (EV_A_ w); } +#if EV_PERIODICS void ev_periodic_start (EV_P_ struct ev_periodic *w) { @@ -1406,6 +1425,7 @@ ev_periodic_again (EV_P_ struct ev_periodic *w) ev_periodic_stop (EV_A_ w); ev_periodic_start (EV_A_ w); } +#endif void ev_idle_start (EV_P_ struct ev_idle *w) @@ -1466,7 +1486,7 @@ void ev_check_stop (EV_P_ struct ev_check *w) { ev_clear_pending (EV_A_ (W)w); - if (ev_is_active (w)) + if (!ev_is_active (w)) return; checks [((W)w)->active - 1] = checks [--checkcnt]; @@ -1537,7 +1557,7 @@ void ev_child_stop (EV_P_ struct ev_child *w) { ev_clear_pending (EV_A_ (W)w); - if (ev_is_active (w)) + if (!ev_is_active (w)) return; wlist_del ((WL *)&childs [w->pid & (PID_HASHSIZE - 1)], (WL)w);