# define EV_MULTIPLICITY 1
#endif
+#ifndef EV_PERIODICS
+# define EV_PERIODICS 1
+#endif
+
/* support multiple event loops? */
#if EV_MULTIPLICITY
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,
#else
# define EV_P void
# define EV_P_
# define EV_A
# define EV_A_
+# define EV_DEFAULT_A
+# define EV_DEFAULT_A_
#endif
/* eventmask, revents, events... */
-#define EV_UNDEF -1 /* guaranteed to be invalid */
-#define EV_NONE 0x00
-#define EV_READ 0x01
-#define EV_WRITE 0x02
-#define EV_TIMEOUT 0x000100
-#define EV_PERIODIC 0x000200
-#define EV_SIGNAL 0x000400
-#define EV_IDLE 0x000800
-#define EV_CHECK 0x001000
-#define EV_PREPARE 0x002000
-#define EV_CHILD 0x004000
-#define EV_ERROR 0x800000 /* sent when an error occurs */
-
-/* can be used to add custom fields to all watchers */
+#define EV_UNDEF -1L /* guaranteed to be invalid */
+#define EV_NONE 0x00L
+#define EV_READ 0x01L /* io only */
+#define EV_WRITE 0x02L /* io only */
+#define EV_TIMEOUT 0x000100L /* timer only */
+#define EV_PERIODIC 0x000200L /* periodic timer only */
+#define EV_SIGNAL 0x000400L /* signal only */
+#define EV_IDLE 0x000800L /* idle only */
+#define EV_CHECK 0x001000L /* check only */
+#define EV_PREPARE 0x002000L /* prepare only */
+#define EV_CHILD 0x004000L /* child/pid only */
+#define EV_ERROR 0x800000L /* sent when an error occurs */
+
+/* can be used to add custom fields to all watchers, while losing binary compatibility */
#ifndef EV_COMMON
-# define EV_COMMON void *data
+# define EV_COMMON void *data;
#endif
#ifndef EV_PROTOTYPES
# define EV_PROTOTYPES 1
int active; /* private */ \
int pending; /* private */ \
int priority; /* private */ \
- EV_COMMON; /* rw */ \
+ EV_COMMON /* rw */ \
EV_CB_DECLARE (type) /* private */
#define EV_WATCHER_LIST(type) \
- EV_WATCHER (type); \
- struct ev_watcher_list *next /* private */
+ EV_WATCHER (type) \
+ struct ev_watcher_list *next; /* private */
#define EV_WATCHER_TIME(type) \
- EV_WATCHER (type); \
- ev_tstamp at /* private */
+ EV_WATCHER (type) \
+ ev_tstamp at; /* private */
/* base class, nothing to see here unless you subclass */
struct ev_watcher
{
- EV_WATCHER (ev_watcher);
+ EV_WATCHER (ev_watcher)
};
/* base class, nothing to see here unless you subclass */
struct ev_watcher_list
{
- EV_WATCHER_LIST (ev_watcher_list);
+ EV_WATCHER_LIST (ev_watcher_list)
};
/* base class, nothing to see here unless you subclass */
struct ev_watcher_time
{
- EV_WATCHER_TIME (ev_watcher_time);
+ EV_WATCHER_TIME (ev_watcher_time)
};
/* invoked after a specific time, repeatable (based on monotonic clock) */
/* revent EV_TIMEOUT */
struct ev_timer
{
- EV_WATCHER_TIME (ev_timer);
+ EV_WATCHER_TIME (ev_timer)
ev_tstamp repeat; /* rw */
};
/* revent EV_PERIODIC */
struct ev_periodic
{
- EV_WATCHER_TIME (ev_periodic);
+ EV_WATCHER_TIME (ev_periodic)
ev_tstamp interval; /* rw */
ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now); /* rw */
/* revent EV_READ, EV_WRITE */
struct ev_io
{
- EV_WATCHER_LIST (ev_io);
+ EV_WATCHER_LIST (ev_io)
int fd; /* ro */
int events; /* ro */
/* revent EV_SIGNAL */
struct ev_signal
{
- EV_WATCHER_LIST (ev_signal);
+ EV_WATCHER_LIST (ev_signal)
int signum; /* ro */
};
/* revent EV_IDLE */
struct ev_idle
{
- EV_WATCHER (ev_idle);
+ EV_WATCHER (ev_idle)
};
/* invoked for each run of the mainloop, just before the blocking call */
/* revent EV_PREPARE */
struct ev_prepare
{
- EV_WATCHER (ev_prepare);
+ EV_WATCHER (ev_prepare)
};
/* invoked for each run of the mainloop, just after the blocking call */
/* revent EV_CHECK */
struct ev_check
{
- EV_WATCHER (ev_check);
+ EV_WATCHER (ev_check)
};
-/* invoked when sigchld is received and waitpid indicates the givne pid */
+/* invoked when sigchld is received and waitpid indicates the given pid */
/* revent EV_CHILD */
/* does not support priorities */
struct ev_child
{
- EV_WATCHER_LIST (ev_child);
+ EV_WATCHER_LIST (ev_child)
int pid; /* ro */
int rpid; /* rw, holds the received pid */
struct ev_child child;
};
-#define EVMETHOD_AUTO 0 /* consults environment */
-#define EVMETHOD_SELECT 1
-#define EVMETHOD_POLL 2
-#define EVMETHOD_EPOLL 4
-#define EVMETHOD_KQUEUE 8
-#define EVMETHOD_DEVPOLL 16 /* NYI */
-#define EVMETHOD_PORT 32 /* NYI */
-#define EVMETHOD_WIN32 64 /* NYI */
-#define EVMETHOD_ANY ~0 /* any method, do not consult env */
+/* bits for ev_default_loop and ev_loop_new */
+/* the default */
+#define EVFLAG_AUTO 0x00000000UL /* not quite a mask */
+/* flag bits */
+#define EVFLAG_NOENV 0x01000000UL /* do NOT consult environment */
+/* method bits to be ored together */
+#define EVBACKEND_SELECT 0x00000001UL /* about anywhere */
+#define EVBACKEND_POLL 0x00000002UL /* !win */
+#define EVBACKEND_EPOLL 0x00000004UL /* linux */
+#define EVBACKEND_KQUEUE 0x00000008UL /* bsd */
+#define EVBACKEND_DEVPOLL 0x00000010UL /* solaris 8 */ /* NYI */
+#define EVBACKEND_PORT 0x00000020UL /* solaris 10 */
#if EV_PROTOTYPES
int ev_version_major (void);
int ev_version_minor (void);
+unsigned int ev_supported_backends (void);
+unsigned int ev_recommended_backends (void);
+
ev_tstamp ev_time (void);
/* Sets the allocation function to use, works like realloc.
# if EV_MULTIPLICITY
/* the default loop is the only one that handles signals and child watchers */
/* you can call this as often as you like */
-struct ev_loop *ev_default_loop (int methods); /* returns default loop */
+static struct ev_loop *
+ev_default_loop (unsigned int flags)
+{
+ extern struct ev_loop *ev_default_loop_ptr;
+ extern struct ev_loop *ev_default_loop_init (unsigned int flags);
+
+ if (!ev_default_loop_ptr)
+ ev_default_loop_init (flags);
+
+ return ev_default_loop_ptr;
+}
/* create and destroy alternative loops that don't handle signals */
-struct ev_loop *ev_loop_new (int methods);
+struct ev_loop *ev_loop_new (unsigned int flags);
void ev_loop_destroy (EV_P);
void ev_loop_fork (EV_P);
+
+ev_tstamp ev_now (EV_P); /* time w.r.t. timers and the eventloop, updated after each poll */
+
# else
-int ev_default_loop (int methods); /* returns true when successful */
+
+int ev_default_loop (unsigned int flags); /* returns true when successful */
+
+static ev_tstamp
+ev_now (void)
+{
+ extern ev_tstamp ev_rt_now;
+
+ return ev_rt_now;
+}
# endif
void ev_default_destroy (void); /* destroy the default loop */
/* you can actually call it at any time, anywhere :) */
void ev_default_fork (void);
-int ev_method (EV_P);
+unsigned int ev_backend (EV_P);
#endif
#define EVLOOP_NONBLOCK 1 /* do not block/wait */
#define EVLOOP_ONESHOT 2 /* block *once* only */
-#define EVUNLOOP_ONCE 1 /* unloop once */
+#define EVUNLOOP_ONE 1 /* unloop once */
#define EVUNLOOP_ALL 2 /* unloop all loops */
#if EV_PROTOTYPES
void ev_loop (EV_P_ int flags);
void ev_unloop (EV_P_ int how); /* set to 1 to break out of event loop, set to 2 to break out of all event loops */
-ev_tstamp ev_now (EV_P); /* time w.r.t. timers and the eventloop, updated after each poll */
-
/*
* ref/unref can be used to add or remove a refcount on the mainloop. every watcher
* keeps one reference. if you have a long-runing watcher you never unregister that
/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */
void ev_timer_again (EV_P_ struct ev_timer *w);
+#if EV_PERIODICS
void ev_periodic_start (EV_P_ struct ev_periodic *w);
void ev_periodic_stop (EV_P_ struct ev_periodic *w);
void ev_periodic_again (EV_P_ struct ev_periodic *w);
+#endif
void ev_idle_start (EV_P_ struct ev_idle *w);
void ev_idle_stop (EV_P_ struct ev_idle *w);