X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/ba71cf07f3506b8e303130e981d3b5b3e9ea5dc8..0a7b0ac074d9987c6fa23ab20be4842e4514c7b9:/ev.h diff --git a/ev.h b/ev.h index 76f7a10..946963d 100644 --- a/ev.h +++ b/ev.h @@ -56,6 +56,10 @@ typedef double ev_tstamp; # define EV_STAT_ENABLE 1 #endif +#ifndef EV_FORK_ENABLE +# define EV_FORK_ENABLE 1 +#endif + #ifndef EV_EMBED_ENABLE # define EV_EMBED_ENABLE 1 #endif @@ -73,15 +77,15 @@ struct ev_loop; # define EV_P_ EV_P, # define EV_A loop # define EV_A_ EV_A, -# define EV_DEFAULT_A ev_default_loop (0) -# define EV_DEFAULT_A_ EV_DEFAULT_A, +# define EV_DEFAULT ev_default_loop (0) +# define EV_DEFAULT_ EV_DEFAULT, #else # define EV_P void # define EV_P_ # define EV_A # define EV_A_ -# define EV_DEFAULT_A -# define EV_DEFAULT_A_ +# define EV_DEFAULT +# define EV_DEFAULT_ # undef EV_EMBED_ENABLE #endif @@ -94,12 +98,13 @@ struct ev_loop; #define EV_TIMEOUT 0x00000100L /* timer timed out */ #define EV_PERIODIC 0x00000200L /* periodic timer timed out */ #define EV_SIGNAL 0x00000400L /* signal was received */ -#define EV_IDLE 0x00000800L /* event loop is idling */ -#define EV_PREPARE 0x00001000L /* event loop about to poll */ -#define EV_CHECK 0x00002000L /* event loop finished poll */ -#define EV_CHILD 0x00004000L /* child/pid had status change */ -#define EV_EMBED 0x00008000L /* embedded event loop needs sweep */ -#define EV_STAT 0x00010000L /* stat data changed */ +#define EV_CHILD 0x00000800L /* child/pid had status change */ +#define EV_STAT 0x00001000L /* stat data changed */ +#define EV_IDLE 0x00002000L /* event loop is idling */ +#define EV_PREPARE 0x00004000L /* event loop about to poll */ +#define EV_CHECK 0x00008000L /* event loop finished poll */ +#define EV_EMBED 0x00010000L /* embedded event loop needs sweep */ +#define EV_FORK 0x00020000L /* event loop resumed in child */ #define EV_ERROR 0x80000000L /* sent when an error occurs */ /* can be used to add custom fields to all watchers, while losing binary compatibility */ @@ -213,23 +218,25 @@ typedef struct ev_child #if EV_STAT_ENABLE /* st_nlink = 0 means missing file or other error */ -#ifdef _WIN32 +# ifdef _WIN32 typedef struct _stati64 ev_statdata; -#else +# else typedef struct stat ev_statdata; -#endif +# endif /* invoked each time the stat data changes for a given path */ /* revent EV_STAT */ typedef struct ev_stat { - EV_WATCHER (ev_stat) + EV_WATCHER_LIST (ev_stat) ev_timer timer; /* private */ ev_tstamp interval; /* ro */ const char *path; /* ro */ ev_statdata prev; /* ro */ ev_statdata attr; /* ro */ + + int wd; /* wd for inotify, fd for kqueue */ } ev_stat; #endif @@ -255,6 +262,14 @@ typedef struct ev_check EV_WATCHER (ev_check) } ev_check; +#if EV_FORK_ENABLE +/* the callback gets invoked before check in the child process when a fork was detected */ +typedef struct ev_fork +{ + EV_WATCHER (ev_fork) +} ev_fork; +#endif + #if EV_EMBED_ENABLE /* used to embed an event loop inside another */ /* the callback gets invoked when the event loop has handled events, and can be 0 */ @@ -276,6 +291,7 @@ union ev_any_watcher struct ev_io io; struct ev_timer timer; struct ev_periodic periodic; + struct ev_signal signal; struct ev_child child; #if EV_STAT_ENABLE struct ev_stat stat; @@ -283,7 +299,9 @@ union ev_any_watcher struct ev_idle idle; struct ev_prepare prepare; struct ev_check check; - struct ev_signal signal; +#if EV_FORK_ENABLE + struct ev_fork fork; +#endif #if EV_EMBED_ENABLE struct ev_embed embed; #endif @@ -294,6 +312,7 @@ union ev_any_watcher #define EVFLAG_AUTO 0x00000000UL /* not quite a mask */ /* flag bits */ #define EVFLAG_NOENV 0x01000000UL /* do NOT consult environment */ +#define EVFLAG_FORKCHECK 0x02000000UL /* check for a fork in each iteration */ /* method bits to be ored together */ #define EVBACKEND_SELECT 0x00000001UL /* about anywhere */ #define EVBACKEND_POLL 0x00000002UL /* !win */ @@ -369,6 +388,7 @@ void ev_default_destroy (void); /* destroy the default loop */ void ev_default_fork (void); unsigned int ev_backend (EV_P); +unsigned int ev_loop_count (EV_P); #endif #define EVLOOP_NONBLOCK 1 /* do not block/wait */ @@ -408,11 +428,12 @@ void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revent #define ev_periodic_set(ev,at_,ival_,res_) do { (ev)->at = (at_); (ev)->interval = (ival_); (ev)->reschedule_cb= (res_); } while (0) #define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0) #define ev_child_set(ev,pid_) do { (ev)->pid = (pid_); } while (0) -#define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); } while (0) +#define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0) #define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */ #define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */ #define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ #define ev_embed_set(ev,loop_) do { (ev)->loop = (loop_); } while (0) +#define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ #define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) #define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) @@ -424,6 +445,7 @@ void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revent #define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) #define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0) #define ev_embed_init(ev,cb,loop) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(loop)); } while (0) +#define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0) #define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */ #define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */ @@ -483,6 +505,11 @@ void ev_prepare_stop (EV_P_ ev_prepare *w); void ev_check_start (EV_P_ ev_check *w); void ev_check_stop (EV_P_ ev_check *w); +# if EV_FORK_ENABLE +void ev_fork_start (EV_P_ ev_fork *w); +void ev_fork_stop (EV_P_ ev_fork *w); +# endif + # if EV_EMBED_ENABLE /* only supported when loop to be embedded is in fact embeddable */ void ev_embed_start (EV_P_ ev_embed *w);