]> git.llucax.com Git - software/libev.git/blobdiff - ev.c
*** empty log message ***
[software/libev.git] / ev.c
diff --git a/ev.c b/ev.c
index 8a32229c6e55572c824aeedd919aea9e0f80071d..14046a2b3b1206a3460f824d14fd7c67880e5373 100644 (file)
--- a/ev.c
+++ b/ev.c
 #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 */
 
 #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))
 
 #if __GNUC__ >= 3
 # define expect(expr,value)         __builtin_expect ((expr),(value))
@@ -217,19 +221,24 @@ typedef struct
 
 #if EV_MULTIPLICITY
 
 
 #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
 
 
 #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
 
 
 #endif
 
@@ -344,21 +353,27 @@ queue_events (EV_P_ W *events, int eventcnt, int type)
     ev_feed_event (EV_A_ events [i], 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)
     {
 {
   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);
     }
 }
 
 
       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
 /*****************************************************************************/
 
 static void
@@ -505,6 +520,18 @@ downheap (WT *heap, int N, int k)
   ((W)heap [k])->active = k + 1;
 }
 
   ((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
 /*****************************************************************************/
 
 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)
 {
 static void
 sigcb (EV_P_ struct ev_io *iow, int revents)
 {
-  WL w;
   int signum;
 
 #ifdef WIN32
   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)
 
   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
 }
 
 static void
@@ -724,7 +765,7 @@ loop_init (EV_P_ int methods)
       if (!method && (methods & EVMETHOD_SELECT)) method = select_init (EV_A_ methods);
 #endif
 
       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);
     }
 }
       ev_set_priority (&sigev, EV_MAXPRI);
     }
 }
@@ -824,13 +865,8 @@ ev_loop_fork (EV_P)
 #endif
 
 #if EV_MULTIPLICITY
 #endif
 
 #if EV_MULTIPLICITY
-struct ev_loop default_loop_struct;
-static struct ev_loop *default_loop;
-
 struct ev_loop *
 #else
 struct ev_loop *
 #else
-static int default_loop;
-
 int
 #endif
 ev_default_loop (int methods)
 int
 #endif
 ev_default_loop (int methods)
@@ -926,7 +962,7 @@ call_pending (EV_P)
         if (p->w)
           {
             p->w->pending = 0;
         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)
   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);
     }
       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)
 {
 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);
 }
   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;
 
       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);
         }
 
       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.);
       if (timeout >= 0.)
         {
           ev_timer_set (&once->to, timeout, 0.);