]> git.llucax.com Git - software/libev.git/commitdiff
implement primitive hook management
authorroot <root>
Wed, 31 Oct 2007 00:32:33 +0000 (00:32 +0000)
committerroot <root>
Wed, 31 Oct 2007 00:32:33 +0000 (00:32 +0000)
ev.c
ev.h

diff --git a/ev.c b/ev.c
index 852c779af3feb7e7e00326faab776bf60be23e56..e328df3b23a116c88e440e319347537a591cc9d2 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -42,6 +42,8 @@ static ev_tstamp method_fudge; /* stupid epoll-returns-early bug */
 static void (*method_modify)(int fd, int oev, int nev);
 static void (*method_poll)(ev_tstamp timeout);
 
+/*****************************************************************************/
+
 ev_tstamp
 ev_time (void)
 {
@@ -81,6 +83,8 @@ get_clock (void)
       cur = newcnt;                                    \
     }
 
+/*****************************************************************************/
+
 typedef struct
 {
   struct ev_io *head;
@@ -137,6 +141,8 @@ fd_event (int fd, int events)
     }
 }
 
+/*****************************************************************************/
+
 static struct ev_timer **atimers;
 static int atimermax, atimercnt;
 
@@ -184,6 +190,8 @@ downheap (struct ev_timer **timers, int N, int k)
   timers [k]->active = k + 1;
 }
 
+/*****************************************************************************/
+
 typedef struct
 {
   struct ev_signal *head;
@@ -253,6 +261,8 @@ siginit (void)
   evio_start (&sigev);
 }
 
+/*****************************************************************************/
+
 #if HAVE_EPOLL
 # include "ev_epoll.c"
 #endif
@@ -294,6 +304,8 @@ int ev_init (int flags)
   return ev_method;
 }
 
+/*****************************************************************************/
+
 void ev_prefork (void)
 {
 }
@@ -316,6 +328,29 @@ void ev_postfork_child (void)
   siginit ();
 }
 
+/*****************************************************************************/
+
+static ev_hook hooks [EVHOOK_NUM];
+
+void
+ev_hook_register (int type, ev_hook hook)
+{
+  hooks [type] = hook;
+}
+
+void
+ev_hook_unregister (int type, ev_hook hook)
+{
+  hooks [type] = 0;
+}
+
+static void
+hook_call (int type)
+{
+  if (hooks [type])
+    hooks [type] ();
+}
+
 static void
 fd_reify (void)
 {
@@ -439,6 +474,8 @@ void ev_loop (int flags)
 
   do
     {
+      hook_call (EVHOOK_PREPOLL);
+
       /* update fd-related kernel structures */
       fd_reify ();
 
@@ -469,6 +506,8 @@ void ev_loop (int flags)
       /* update ev_now, do magic */
       time_update ();
 
+      hook_call (EVHOOK_POSTPOLL);
+
       /* put pending timers into pendign queue and reschedule them */
       /* absolute timers first */
       timers_reify (atimers, atimercnt, ev_now);
@@ -480,6 +519,8 @@ void ev_loop (int flags)
   while (!ev_loop_done);
 }
 
+/*****************************************************************************/
+
 static void
 wlist_add (struct ev_watcher_list **head, struct ev_watcher_list *elem)
 {
@@ -519,6 +560,8 @@ ev_stop (struct ev_watcher *w)
   /* nop */
 }
 
+/*****************************************************************************/
+
 void
 evio_start (struct ev_io *w)
 {
@@ -673,7 +716,7 @@ int main (void)
 
   struct ev_timer t[10000];
 
-#if 0
+#if 1
   int i;
   for (i = 0; i < 10000; ++i)
     {
diff --git a/ev.h b/ev.h
index 34670609a13cbde1107b9c25166b72c94b8db8dc..9290378aa5df3caae305ff06077e64cd260c92aa 100644 (file)
--- a/ev.h
+++ b/ev.h
@@ -64,6 +64,13 @@ ev_tstamp ev_time (void);
 void ev_loop (int flags);
 extern int ev_loop_done; /* set to 1 to break out of event loop */
 
+#define EVHOOK_PREPOLL  0 /* called before updating fds, timers and blocking */
+#define EVHOOK_POSTPOLL 1 /* called after blocking */
+#define EVHOOK_NUM      2 /* just the # of hooks */
+typedef void (*ev_hook)(void);
+void ev_hook_register (int type, ev_hook hook);
+void ev_hook_unregister (int type, ev_hook hook);
+
 /* these may evaluate ev multiple times, and the other arguments at most once */
 #define evw_init(ev,cb_,data_)             do { (ev)->active = 0; (ev)->cb = (cb_); (ev)->data = (void *)data_; } while (0)