X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/6724cd5b6ffe05187a5520b0cd3771c7dbe83896..18894ffdcf36dd48598363b9551cc04b1168b3ee:/ev.c?ds=inline diff --git a/ev.c b/ev.c index 77e8011..3e008a4 100644 --- a/ev.c +++ b/ev.c @@ -28,27 +28,36 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#ifdef __cplusplus +extern "C" { +#endif + #ifndef EV_STANDALONE # 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_WORKING_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 @@ -154,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 /*****************************************************************************/ @@ -223,6 +234,7 @@ typedef struct struct ev_loop { + ev_tstamp ev_rt_now; #define VAR(name,decl) decl; #include "ev_vars.h" #undef VAR @@ -234,6 +246,7 @@ typedef struct #else + ev_tstamp ev_rt_now; #define VAR(name,decl) static decl; #include "ev_vars.h" #undef VAR @@ -244,7 +257,7 @@ typedef struct /*****************************************************************************/ -inline ev_tstamp +ev_tstamp ev_time (void) { #if EV_USE_REALTIME @@ -799,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); @@ -982,7 +997,11 @@ timers_reify (EV_P) if (w->repeat) { assert (("negative ev_timer repeat value found while processing timers", w->repeat > 0.)); - ((WT)w)->at = mn_now + w->repeat; + + ((WT)w)->at += w->repeat; + if (((WT)w)->at < mn_now) + ((WT)w)->at = mn_now; + downheap ((WT *)timers, timercnt, 0); } else @@ -992,6 +1011,7 @@ timers_reify (EV_P) } } +#if EV_PERIODICS static void periodics_reify (EV_P) { @@ -1042,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) @@ -1085,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) */ } @@ -1097,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) @@ -1170,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.; } @@ -1186,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)) @@ -1287,6 +1316,8 @@ ev_io_stop (EV_P_ struct ev_io *w) if (!ev_is_active (w)) return; + assert (("ev_io_start called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); + wlist_del ((WL *)&anfds[w->fd].head, (WL)w); ev_stop (EV_A_ (W)w); @@ -1326,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); } @@ -1345,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) { @@ -1393,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) @@ -1453,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]; @@ -1524,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); @@ -1594,3 +1627,7 @@ ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, vo } } +#ifdef __cplusplus +} +#endif +