]> 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 5756bb73d7bce066330fd047a860700517b62e29..53491e1130c6c2c7093b1fd52d7f213ac2a32cd4 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -147,6 +147,12 @@ typedef struct ev_watcher_time *WT;
 
 static int have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */
 
+#if WIN32
+/* note: the comment below could not be substantiated, but what would I care */
+/* MSDN says this is required to handle SIGFPE */
+volatile double SIGFPE_REQ = 0.0f; 
+#endif
+
 /*****************************************************************************/
 
 typedef struct
@@ -234,6 +240,17 @@ ev_now (EV_P)
       cur = newcnt;                                    \
     }
 
+#define array_slim(stem)                                       \
+  if (stem ## max < array_roundsize (stem ## cnt >> 2))                \
+    {                                                          \
+      stem ## max = array_roundsize (stem ## cnt >> 1);                \
+      base = realloc (base, sizeof (*base) * (stem ## max));   \
+      fprintf (stderr, "slimmed down " # stem " to %d\n", stem ## max);/*D*/\
+    }
+
+#define array_free(stem, idx) \
+  free (stem ## s idx); stem ## cnt idx = stem ## max idx = 0;
+
 /*****************************************************************************/
 
 static void
@@ -308,11 +325,8 @@ fd_reify (EV_P)
 
       anfd->reify = 0;
 
-      if (anfd->events != events)
-        {
-          method_modify (EV_A_ fd, anfd->events, events);
-          anfd->events = events;
-        }
+      method_modify (EV_A_ fd, anfd->events, events);
+      anfd->events = events;
     }
 
   fdchangecnt = 0;
@@ -458,6 +472,10 @@ signals_init (ANSIG *base, int count)
 static void
 sighandler (int signum)
 {
+#if WIN32
+  signal (signum, sighandler);
+#endif
+
   signals [signum - 1].gotsig = 1;
 
   if (!gotsig)
@@ -639,6 +657,8 @@ loop_init (EV_P_ int methods)
 void
 loop_destroy (EV_P)
 {
+  int i;
+
 #if EV_USE_WIN32
   if (method == EVMETHOD_WIN32 ) win32_destroy  (EV_A);
 #endif
@@ -655,6 +675,16 @@ loop_destroy (EV_P)
   if (method == EVMETHOD_SELECT) select_destroy (EV_A);
 #endif
 
+  for (i = NUMPRI; i--; )
+    array_free (pending, [i]);
+
+  array_free (fdchange, );
+  array_free (timer, );
+  array_free (periodic, );
+  array_free (idle, );
+  array_free (prepare, );
+  array_free (check, );
+
   method = 0;
   /*TODO*/
 }
@@ -798,8 +828,7 @@ call_pending (EV_P)
         if (p->w)
           {
             p->w->pending = 0;
-
-            (*(void (**)(EV_P_ W, int))&p->w->cb) (EV_A_ p->w, p->events);
+            p->w->cb (EV_A_ p->w, p->events);
           }
       }
 }
@@ -1301,11 +1330,15 @@ ev_signal_start (EV_P_ struct ev_signal *w)
 
   if (!((WL)w)->next)
     {
+#if WIN32
+      signal (w->signum, sighandler);
+#else
       struct sigaction sa;
       sa.sa_handler = sighandler;
       sigfillset (&sa.sa_mask);
       sa.sa_flags = SA_RESTART; /* if restarting works we save one iteration */
       sigaction (w->signum, &sa, 0);
+#endif
     }
 }