]> 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 8c3bf01ba6f2818393d0b45a94ebeddc1d8c7db8..9674c7c056c75b7192c3fe8608a54a8e5dc5e57a 100644 (file)
--- a/ev.c
+++ b/ev.c
 # define EV_USE_EPOLL 0
 #endif
 
+#ifndef CLOCK_REALTIME
+# define EV_USE_REALTIME 0
+#endif
 #ifndef EV_USE_REALTIME
 # define EV_USE_REALTIME 1 /* posix requirement, but might be slower */
 #endif
 
 #define MIN_TIMEJUMP  1. /* minimum timejump that gets detected (if monotonic clock available) */
-#define MAX_BLOCKTIME 59.731
-#define PID_HASHSIZE  16 /* size of pid hahs table, must be power of two */
+#define MAX_BLOCKTIME 59.731 /* never wait longer than this time (to detetc time jumps) */
+#define PID_HASHSIZE  16 /* size of pid hash table, must be power of two */
+#define CLEANUP_INTERVAL (MAX_BLOCKTIME * 5.) /* how often to try to free memory and re-check fds */
 
 #include "ev.h"
 
@@ -115,8 +119,7 @@ get_clock (void)
   return ev_time ();
 }
 
-#define array_nextsize(n) (((n) << 1) | 4 & ~3)
-#define array_prevsize(n) (((n) >> 1) | 4 & ~3)
+#define array_roundsize(base,n) ((n) | 4 & ~3)
 
 #define array_needsize(base,cur,cnt,init)              \
   if ((cnt) > cur)                                     \
@@ -124,7 +127,7 @@ get_clock (void)
       int newcnt = cur;                                        \
       do                                               \
         {                                              \
-          newcnt = array_nextsize (newcnt);            \
+          newcnt = array_roundsize (base, newcnt << 1);        \
         }                                              \
       while ((cnt) > newcnt);                          \
                                                        \
@@ -167,13 +170,16 @@ static int pendingmax, pendingcnt;
 static void
 event (W w, int events)
 {
-  if (w->active)
+  if (w->pending)
     {
-      w->pending = ++pendingcnt;
-      array_needsize (pendings, pendingmax, pendingcnt, );
-      pendings [pendingcnt - 1].w      = w;
-      pendings [pendingcnt - 1].events = events;
+      pendings [w->pending - 1].events |= events;
+      return;
     }
+
+  w->pending = ++pendingcnt;
+  array_needsize (pendings, pendingmax, pendingcnt, );
+  pendings [pendingcnt - 1].w      = w;
+  pendings [pendingcnt - 1].events = events;
 }
 
 static void
@@ -257,8 +263,8 @@ fd_recheck (void)
       if (fcntl (fd, F_GETFD) == -1 && errno == EBADF)
         while (anfds [fd].head)
           {
-            event ((W)anfds [fd].head, EV_ERROR | EV_READ | EV_WRITE | EV_TIMEOUT);
             ev_io_stop (anfds [fd].head);
+            event ((W)anfds [fd].head, EV_ERROR | EV_READ | EV_WRITE | EV_TIMEOUT);
           }
 }
 
@@ -531,8 +537,6 @@ timers_reify (void)
     {
       struct ev_timer *w = timers [0];
 
-      event ((W)w, EV_TIMEOUT);
-
       /* first reschedule or stop timer */
       if (w->repeat)
         {
@@ -542,6 +546,8 @@ timers_reify (void)
         }
       else
         ev_timer_stop (w); /* nonrepeating: stop timer */
+
+      event ((W)w, EV_TIMEOUT);
     }
 }