X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/48151275f9dd2099bb2e98f47a341678182d9230..f0e9f4e4e09ba9877ac4d15fefde761cc96cd317:/ev.c diff --git a/ev.c b/ev.c index 8a32229..14046a2 100644 --- a/ev.c +++ b/ev.c @@ -128,7 +128,11 @@ #define PID_HASHSIZE 16 /* size of pid hash table, must be power of two */ /*#define CLEANUP_INTERVAL 300. /* how often to try to free memory and re-check fds */ -#include "ev.h" +#ifdef EV_H +# include EV_H +#else +# include "ev.h" +#endif #if __GNUC__ >= 3 # define expect(expr,value) __builtin_expect ((expr),(value)) @@ -217,19 +221,24 @@ typedef struct #if EV_MULTIPLICITY -struct ev_loop -{ -# define VAR(name,decl) decl; -# include "ev_vars.h" -}; -# undef VAR -# include "ev_wrap.h" + struct ev_loop + { + #define VAR(name,decl) decl; + #include "ev_vars.h" + #undef VAR + }; + #include "ev_wrap.h" + + struct ev_loop default_loop_struct; + static struct ev_loop *default_loop; #else -# define VAR(name,decl) static decl; -# include "ev_vars.h" -# undef VAR + #define VAR(name,decl) static decl; + #include "ev_vars.h" + #undef VAR + + static int default_loop; #endif @@ -344,21 +353,27 @@ queue_events (EV_P_ W *events, int eventcnt, int type) ev_feed_event (EV_A_ events [i], type); } -static void -fd_event (EV_P_ int fd, int events) +inline void +fd_event (EV_P_ int fd, int revents) { ANFD *anfd = anfds + fd; struct ev_io *w; for (w = (struct ev_io *)anfd->head; w; w = (struct ev_io *)((WL)w)->next) { - int ev = w->events & events; + int ev = w->events & revents; if (ev) ev_feed_event (EV_A_ (W)w, ev); } } +void +ev_feed_fd_event (EV_P_ int fd, int revents) +{ + fd_event (EV_A_ fd, revents); +} + /*****************************************************************************/ static void @@ -505,6 +520,18 @@ downheap (WT *heap, int N, int k) ((W)heap [k])->active = k + 1; } +inline void +adjustheap (WT *heap, int N, int k, ev_tstamp at) +{ + ev_tstamp old_at = heap [k]->at; + heap [k]->at = at; + + if (old_at < at) + downheap (heap, N, k); + else + upheap (heap, k); +} + /*****************************************************************************/ typedef struct @@ -554,10 +581,29 @@ sighandler (int signum) } } +void +ev_feed_signal_event (EV_P_ int signum) +{ + WL w; + +#if EV_MULTIPLICITY + assert (("feeding signal events is only supported in the default loop", loop == default_loop)); +#endif + + --signum; + + if (signum < 0 || signum >= signalmax) + return; + + signals [signum].gotsig = 0; + + for (w = signals [signum].head; w; w = w->next) + ev_feed_event (EV_A_ (W)w, EV_SIGNAL); +} + static void sigcb (EV_P_ struct ev_io *iow, int revents) { - WL w; int signum; #ifdef WIN32 @@ -569,12 +615,7 @@ sigcb (EV_P_ struct ev_io *iow, int revents) for (signum = signalmax; signum--; ) if (signals [signum].gotsig) - { - signals [signum].gotsig = 0; - - for (w = signals [signum].head; w; w = w->next) - ev_feed_event (EV_A_ (W)w, EV_SIGNAL); - } + ev_feed_signal_event (EV_A_ signum + 1); } static void @@ -724,7 +765,7 @@ loop_init (EV_P_ int methods) if (!method && (methods & EVMETHOD_SELECT)) method = select_init (EV_A_ methods); #endif - ev_watcher_init (&sigev, sigcb); + ev_init (&sigev, sigcb); ev_set_priority (&sigev, EV_MAXPRI); } } @@ -824,13 +865,8 @@ ev_loop_fork (EV_P) #endif #if EV_MULTIPLICITY -struct ev_loop default_loop_struct; -static struct ev_loop *default_loop; - struct ev_loop * #else -static int default_loop; - int #endif ev_default_loop (int methods) @@ -926,7 +962,7 @@ call_pending (EV_P) if (p->w) { p->w->pending = 0; - p->w->cb (EV_A_ p->w, p->events); + EV_CB_INVOKE (p->w, p->events); } } } @@ -1299,10 +1335,7 @@ ev_timer_again (EV_P_ struct ev_timer *w) if (ev_is_active (w)) { if (w->repeat) - { - ((WT)w)->at = mn_now + w->repeat; - downheap ((WT *)timers, timercnt, ((W)w)->active - 1); - } + adjustheap ((WT *)timers, timercnt, ((W)w)->active - 1, mn_now + w->repeat); else ev_timer_stop (EV_A_ w); } @@ -1354,6 +1387,7 @@ ev_periodic_stop (EV_P_ struct ev_periodic *w) void ev_periodic_again (EV_P_ struct ev_periodic *w) { + /* TODO: use adjustheap and recalculation */ ev_periodic_stop (EV_A_ w); ev_periodic_start (EV_A_ w); } @@ -1542,14 +1576,14 @@ ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, vo once->cb = cb; once->arg = arg; - ev_watcher_init (&once->io, once_cb_io); + ev_init (&once->io, once_cb_io); if (fd >= 0) { ev_io_set (&once->io, fd, events); ev_io_start (EV_A_ &once->io); } - ev_watcher_init (&once->to, once_cb_to); + ev_init (&once->to, once_cb_to); if (timeout >= 0.) { ev_timer_set (&once->to, timeout, 0.);