From b7e58d7ed7f85d7cb7fe1c34cfe3fa2484a6dc31 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 26 Nov 2007 19:49:36 +0000 Subject: - add non-os-assisted ev_stat watcher - add some EV_MINIMAL, exg made me do it --- ev.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 117 insertions(+), 45 deletions(-) (limited to 'ev.c') diff --git a/ev.c b/ev.c index 4cb9467..96d297c 100644 --- a/ev.c +++ b/ev.c @@ -113,9 +113,9 @@ extern "C" { #include #ifndef _WIN32 -# include # include # include +# include #else # define WIN32_LEAN_AND_MEAN # include @@ -189,10 +189,19 @@ extern "C" { #if __GNUC__ >= 3 # define expect(expr,value) __builtin_expect ((expr),(value)) -# define inline static inline +# define inline_size static inline /* inline for codesize */ +# if EV_MINIMAL +# define noinline __attribute__ ((noinline)) +# define inline_speed static noinline +# else +# define noinline +# define inline_speed static inline +# endif #else # define expect(expr,value) (expr) -# define inline static +# define inline_speed static +# define inline_minimal static +# define noinline #endif #define expect_false(expr) expect ((expr) != 0, 0) @@ -308,7 +317,7 @@ typedef struct /*****************************************************************************/ -ev_tstamp +ev_tstamp noinline ev_time (void) { #if EV_USE_REALTIME @@ -322,7 +331,7 @@ ev_time (void) #endif } -inline ev_tstamp +ev_tstamp inline_size get_clock (void) { #if EV_USE_MONOTONIC @@ -375,7 +384,7 @@ ev_now (EV_P) /*****************************************************************************/ -static void +void inline_size anfds_init (ANFD *base, int count) { while (count--) @@ -388,7 +397,7 @@ anfds_init (ANFD *base, int count) } } -void +void noinline ev_feed_event (EV_P_ void *w, int revents) { W w_ = (W)w; @@ -414,7 +423,7 @@ queue_events (EV_P_ W *events, int eventcnt, int type) ev_feed_event (EV_A_ events [i], type); } -inline void +void inline_speed fd_event (EV_P_ int fd, int revents) { ANFD *anfd = anfds + fd; @@ -437,7 +446,7 @@ ev_feed_fd_event (EV_P_ int fd, int revents) /*****************************************************************************/ -inline void +void inline_size fd_reify (EV_P) { int i; @@ -471,7 +480,7 @@ fd_reify (EV_P) fdchangecnt = 0; } -static void +void inline_size fd_change (EV_P_ int fd) { if (expect_false (anfds [fd].reify)) @@ -484,7 +493,7 @@ fd_change (EV_P_ int fd) fdchanges [fdchangecnt - 1] = fd; } -static void +void inline_speed fd_kill (EV_P_ int fd) { ev_io *w; @@ -496,7 +505,7 @@ fd_kill (EV_P_ int fd) } } -inline int +int inline_size fd_valid (int fd) { #ifdef _WIN32 @@ -507,7 +516,7 @@ fd_valid (int fd) } /* called on EBADF to verify fds */ -static void +static void noinline fd_ebadf (EV_P) { int fd; @@ -519,7 +528,7 @@ fd_ebadf (EV_P) } /* called on ENOMEM in select/poll to kill some fds and retry */ -static void +static void noinline fd_enomem (EV_P) { int fd; @@ -533,7 +542,7 @@ fd_enomem (EV_P) } /* usually called after fork if backend needs to re-arm all fds from scratch */ -static void +static void noinline fd_rearm_all (EV_P) { int fd; @@ -549,7 +558,7 @@ fd_rearm_all (EV_P) /*****************************************************************************/ -static void +void inline_speed upheap (WT *heap, int k) { WT w = heap [k]; @@ -566,7 +575,7 @@ upheap (WT *heap, int k) } -static void +void inline_speed downheap (WT *heap, int N, int k) { WT w = heap [k]; @@ -590,7 +599,7 @@ downheap (WT *heap, int N, int k) ((W)heap [k])->active = k + 1; } -inline void +void inline_size adjustheap (WT *heap, int N, int k) { upheap (heap, k); @@ -612,7 +621,7 @@ static int sigpipe [2]; static sig_atomic_t volatile gotsig; static ev_io sigev; -static void +void inline_size signals_init (ANSIG *base, int count) { while (count--) @@ -642,7 +651,7 @@ sighandler (int signum) } } -void +void noinline ev_feed_signal_event (EV_P_ int signum) { WL w; @@ -675,7 +684,7 @@ sigcb (EV_P_ ev_io *iow, int revents) ev_feed_signal_event (EV_A_ signum + 1); } -static void +void inline_size fd_intern (int fd) { #ifdef _WIN32 @@ -687,7 +696,7 @@ fd_intern (int fd) #endif } -static void +static void noinline siginit (EV_P) { fd_intern (sigpipe [0]); @@ -710,7 +719,7 @@ static ev_signal childev; # define WCONTINUED 0 #endif -static void +void inline_speed child_reap (EV_P_ ev_signal *sw, int chain, int pid, int status) { ev_child *w; @@ -774,7 +783,7 @@ ev_version_minor (void) } /* return true if we are running with elevated privileges and should ignore env variables */ -static int +int inline_size enable_secure (void) { #ifdef _WIN32 @@ -906,7 +915,7 @@ loop_destroy (EV_P) /* have to use the microsoft-never-gets-it-right macro */ array_free (fdchange, EMPTY0); array_free (timer, EMPTY0); -#if EV_PERIODICS +#if EV_PERIODIC_ENABLE array_free (periodic, EMPTY0); #endif array_free (idle, EMPTY0); @@ -1052,7 +1061,7 @@ ev_default_fork (void) /*****************************************************************************/ -static int +int inline_size any_pending (EV_P) { int pri; @@ -1064,7 +1073,7 @@ any_pending (EV_P) return 0; } -inline void +void inline_speed call_pending (EV_P) { int pri; @@ -1084,7 +1093,7 @@ call_pending (EV_P) } } -inline void +void inline_size timers_reify (EV_P) { while (timercnt && ((WT)timers [0])->at <= mn_now) @@ -1111,8 +1120,8 @@ timers_reify (EV_P) } } -#if EV_PERIODICS -inline void +#if EV_PERIODIC_ENABLE +void inline_size periodics_reify (EV_P) { while (periodiccnt && ((WT)periodics [0])->at <= ev_rt_now) @@ -1141,7 +1150,7 @@ periodics_reify (EV_P) } } -static void +static void noinline periodics_reschedule (EV_P) { int i; @@ -1163,7 +1172,7 @@ periodics_reschedule (EV_P) } #endif -inline int +int inline_size time_update_monotonic (EV_P) { mn_now = get_clock (); @@ -1181,7 +1190,7 @@ time_update_monotonic (EV_P) } } -inline void +void inline_size time_update (EV_P) { int i; @@ -1213,7 +1222,7 @@ time_update (EV_P) now_floor = mn_now; } -# if EV_PERIODICS +# if EV_PERIODIC_ENABLE periodics_reschedule (EV_A); # endif /* no timer adjustment, as the monotonic clock doesn't jump */ @@ -1227,7 +1236,7 @@ time_update (EV_P) if (expect_false (mn_now > ev_rt_now || mn_now < ev_rt_now - MAX_BLOCKTIME - MIN_TIMEJUMP)) { -#if EV_PERIODICS +#if EV_PERIODIC_ENABLE periodics_reschedule (EV_A); #endif @@ -1304,7 +1313,7 @@ ev_loop (EV_P_ int flags) if (block > to) block = to; } -#if EV_PERIODICS +#if EV_PERIODIC_ENABLE if (periodiccnt) { ev_tstamp to = ((WT)periodics [0])->at - ev_rt_now + backend_fudge; @@ -1323,7 +1332,7 @@ ev_loop (EV_P_ int flags) /* queue pending timers and reschedule them */ timers_reify (EV_A); /* relative timers called last */ -#if EV_PERIODICS +#if EV_PERIODIC_ENABLE periodics_reify (EV_A); /* absolute timers called first */ #endif @@ -1353,14 +1362,14 @@ ev_unloop (EV_P_ int how) /*****************************************************************************/ -inline void +void inline_size wlist_add (WL *head, WL elem) { elem->next = *head; *head = elem; } -inline void +void inline_size wlist_del (WL *head, WL elem) { while (*head) @@ -1375,7 +1384,7 @@ wlist_del (WL *head, WL elem) } } -inline void +void inline_speed ev_clear_pending (EV_P_ W w) { if (w->pending) @@ -1385,7 +1394,7 @@ ev_clear_pending (EV_P_ W w) } } -inline void +void inline_speed ev_start (EV_P_ W w, int active) { if (w->priority < EV_MINPRI) w->priority = EV_MINPRI; @@ -1395,7 +1404,7 @@ ev_start (EV_P_ W w, int active) ev_ref (EV_A); } -inline void +void inline_size ev_stop (EV_P_ W w) { ev_unref (EV_A); @@ -1494,7 +1503,7 @@ ev_timer_again (EV_P_ ev_timer *w) } } -#if EV_PERIODICS +#if EV_PERIODIC_ENABLE void ev_periodic_start (EV_P_ ev_periodic *w) { @@ -1697,8 +1706,8 @@ ev_child_stop (EV_P_ ev_child *w) ev_stop (EV_A_ (W)w); } -#if EV_MULTIPLICITY -void +#if EV_EMBED_ENABLE +void noinline ev_embed_sweep (EV_P_ ev_embed *w) { ev_loop (w->loop, EVLOOP_NONBLOCK); @@ -1729,6 +1738,7 @@ ev_embed_start (EV_P_ ev_embed *w) ev_set_priority (&w->io, ev_priority (w)); ev_io_start (EV_A_ &w->io); + ev_start (EV_A_ (W)w, 1); } @@ -1740,6 +1750,68 @@ ev_embed_stop (EV_P_ ev_embed *w) return; ev_io_stop (EV_A_ &w->io); + + ev_stop (EV_A_ (W)w); +} +#endif + +#if EV_STAT_ENABLE + +# ifdef _WIN32 +# define lstat(a,b) stat(a,b) +# endif + +void +ev_stat_stat (EV_P_ ev_stat *w) +{ + if (lstat (w->path, &w->attr) < 0) + w->attr.st_nlink = 0; + else if (!w->attr.st_nlink) + w->attr.st_nlink = 1; +} + +static void +stat_timer_cb (EV_P_ ev_timer *w_, int revents) +{ + ev_stat *w = (ev_stat *)(((char *)w_) - offsetof (ev_stat, timer)); + + /* we copy this here each the time so that */ + /* prev has the old value when the callback gets invoked */ + w->prev = w->attr; + ev_stat_stat (EV_A_ w); + + if (memcmp (&w->prev, &w->attr, sizeof (ev_statdata))) + ev_feed_event (EV_A_ w, EV_STAT); +} + +void +ev_stat_start (EV_P_ ev_stat *w) +{ + if (expect_false (ev_is_active (w))) + return; + + /* since we use memcmp, we need to clear any padding data etc. */ + memset (&w->prev, 0, sizeof (ev_statdata)); + memset (&w->attr, 0, sizeof (ev_statdata)); + + ev_stat_stat (EV_A_ w); + + ev_timer_init (&w->timer, stat_timer_cb, w->interval, w->interval); + ev_set_priority (&w->timer, ev_priority (w)); + ev_timer_start (EV_A_ &w->timer); + + ev_start (EV_A_ (W)w, 1); +} + +void +ev_stat_stop (EV_P_ ev_stat *w) +{ + ev_clear_pending (EV_A_ (W)w); + if (expect_false (!ev_is_active (w))) + return; + + ev_timer_stop (EV_A_ &w->timer); + ev_stop (EV_A_ (W)w); } #endif -- cgit v1.2.3