]> git.llucax.com Git - software/libev.git/blobdiff - ev.c
try without wcontinued for borked systems
[software/libev.git] / ev.c
diff --git a/ev.c b/ev.c
index 96d297ceb37487789a2fb91ab3c6be6904cc6e15..e5992c339d538a2a0e8d152117edca027640e0bd 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -227,12 +227,13 @@ static int have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */
 
 static void (*syserr_cb)(const char *msg);
 
-void ev_set_syserr_cb (void (*cb)(const char *msg))
+void
+ev_set_syserr_cb (void (*cb)(const char *msg))
 {
   syserr_cb = cb;
 }
 
-static void
+static void noinline
 syserr (const char *msg)
 {
   if (!msg)
@@ -249,7 +250,8 @@ syserr (const char *msg)
 
 static void *(*alloc)(void *ptr, long size);
 
-void ev_set_allocator (void *(*cb)(void *ptr, long size))
+void
+ev_set_allocator (void *(*cb)(void *ptr, long size))
 {
   alloc = cb;
 }
@@ -317,7 +319,7 @@ typedef struct
 
 /*****************************************************************************/
 
-ev_tstamp noinline
+ev_tstamp
 ev_time (void)
 {
 #if EV_USE_REALTIME
@@ -384,19 +386,6 @@ ev_now (EV_P)
 
 /*****************************************************************************/
 
-void inline_size
-anfds_init (ANFD *base, int count)
-{
-  while (count--)
-    {
-      base->head   = 0;
-      base->events = EV_NONE;
-      base->reify  = 0;
-
-      ++base;
-    }
-}
-
 void noinline
 ev_feed_event (EV_P_ void *w, int revents)
 {
@@ -414,7 +403,7 @@ ev_feed_event (EV_P_ void *w, int revents)
   pendings [ABSPRI (w_)][w_->pending - 1].events = revents;
 }
 
-static void
+void inline_size
 queue_events (EV_P_ W *events, int eventcnt, int type)
 {
   int i;
@@ -423,6 +412,21 @@ queue_events (EV_P_ W *events, int eventcnt, int type)
     ev_feed_event (EV_A_ events [i], type);
 }
 
+/*****************************************************************************/
+
+void inline_size
+anfds_init (ANFD *base, int count)
+{
+  while (count--)
+    {
+      base->head   = 0;
+      base->events = EV_NONE;
+      base->reify  = 0;
+
+      ++base;
+    }
+}
+
 void inline_speed
 fd_event (EV_P_ int fd, int revents)
 {
@@ -444,8 +448,6 @@ ev_feed_fd_event (EV_P_ int fd, int revents)
   fd_event (EV_A_ fd, revents);
 }
 
-/*****************************************************************************/
-
 void inline_size
 fd_reify (EV_P)
 {
@@ -715,10 +717,6 @@ static ev_child *childs [PID_HASHSIZE];
 
 static ev_signal childev;
 
-#ifndef WCONTINUED
-# define WCONTINUED 0
-#endif
-
 void inline_speed
 child_reap (EV_P_ ev_signal *sw, int chain, int pid, int status)
 {
@@ -734,20 +732,28 @@ child_reap (EV_P_ ev_signal *sw, int chain, int pid, int status)
       }
 }
 
+#ifndef WCONTINUED
+# define WCONTINUED 0
+#endif
+
 static void
 childcb (EV_P_ ev_signal *sw, int revents)
 {
   int pid, status;
 
-  if (0 < (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED)))
-    {
-      /* make sure we are called again until all childs have been reaped */
-      /* we need to do it this way so that the callback gets called before we continue */
-      ev_feed_event (EV_A_ (W)sw, EV_SIGNAL);
+  /* some systems define WCONTINUED but then fail to support it (linux 2.4) */
+  if (0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED)))
+    if (!WCONTINUED
+        || errno != EINVAL
+        || 0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED)))
+      return;
 
-      child_reap (EV_A_ sw, pid, pid, status);
-      child_reap (EV_A_ sw,   0, pid, status); /* this might trigger a watcher twice, but feed_event catches that */
-    }
+  /* make sure we are called again until all childs have been reaped */
+  /* we need to do it this way so that the callback gets called before we continue */
+  ev_feed_event (EV_A_ (W)sw, EV_SIGNAL);
+
+  child_reap (EV_A_ sw, pid, pid, status);
+  child_reap (EV_A_ sw,   0, pid, status); /* this might trigger a watcher twice, but feed_event catches that */
 }
 
 #endif