]> 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 6c2f3977d815a785bbdc78b5acd24b8f410b9f10..3e1e8b4c7ca40a029e43d7b35f924fac404a06ab 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -415,8 +415,10 @@ sighandler (int signum)
 
   if (!gotsig)
     {
 
   if (!gotsig)
     {
+      int old_errno = errno;
       gotsig = 1;
       write (sigpipe [1], &signum, 1);
       gotsig = 1;
       write (sigpipe [1], &signum, 1);
+      errno = old_errno;
     }
 }
 
     }
 }
 
@@ -478,19 +480,35 @@ static struct ev_signal childev;
 #endif
 
 static void
 #endif
 
 static void
-childcb (struct ev_signal *sw, int revents)
+child_reap (struct ev_signal *sw, int chain, int pid, int status)
 {
   struct ev_child *w;
 {
   struct ev_child *w;
+
+  for (w = childs [chain & (PID_HASHSIZE - 1)]; w; w = w->next)
+    if (w->pid == pid || !w->pid)
+      {
+        w->priority = sw->priority; /* need to do it *now* */
+        w->rpid     = pid;
+        w->rstatus  = status;
+        printf ("rpid %p %d %d\n", w, pid, w->pid);//D
+        event ((W)w, EV_CHILD);
+      }
+}
+
+static void
+childcb (struct ev_signal *sw, int revents)
+{
   int pid, status;
 
   int pid, status;
 
-  while ((pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED)) != -1)
-    for (w = childs [pid & (PID_HASHSIZE - 1)]; w; w = w->next)
-      if (w->pid == pid || !w->pid)
-        {
-          w->rpid    = pid;
-          w->rstatus = status;
-          event ((W)w, EV_CHILD);
-        }
+            printf ("chld %x\n", revents);//D
+  if (0 < (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED)))
+    {
+      /* make sure we are called again until all childs have been reaped */
+      event ((W)sw, EV_SIGNAL);
+
+      child_reap (sw, pid, pid, status);
+      child_reap (sw,   0, pid, status); /* this might trigger a watcher twice, but event catches that */
+    }
 }
 
 #endif
 }
 
 #endif
@@ -522,12 +540,16 @@ ev_version_minor (void)
   return EV_VERSION_MINOR;
 }
 
   return EV_VERSION_MINOR;
 }
 
-/* return true if we are running with elevated privileges and ignore env variables */
+/* return true if we are running with elevated privileges and should ignore env variables */
 static int
 enable_secure ()
 {
 static int
 enable_secure ()
 {
+#ifdef WIN32
+  return 0;
+#else
   return getuid () != geteuid ()
       || getgid () != getegid ();
   return getuid () != geteuid ()
       || getgid () != getegid ();
+#endif
 }
 
 int ev_init (int methods)
 }
 
 int ev_init (int methods)
@@ -573,10 +595,12 @@ int ev_init (int methods)
       if (ev_method)
         {
           ev_watcher_init (&sigev, sigcb);
       if (ev_method)
         {
           ev_watcher_init (&sigev, sigcb);
+          ev_set_priority (&sigev, EV_MAXPRI);
           siginit ();
 
 #ifndef WIN32
           ev_signal_init (&childev, childcb, SIGCHLD);
           siginit ();
 
 #ifndef WIN32
           ev_signal_init (&childev, childcb, SIGCHLD);
+          ev_set_priority (&childev, EV_MAXPRI);
           ev_signal_start (&childev);
 #endif
         }
           ev_signal_start (&childev);
 #endif
         }
@@ -1010,6 +1034,10 @@ ev_periodic_stop (struct ev_periodic *w)
   ev_stop ((W)w);
 }
 
   ev_stop ((W)w);
 }
 
+#ifndef SA_RESTART
+# define SA_RESTART 0
+#endif
+
 void
 ev_signal_start (struct ev_signal *w)
 {
 void
 ev_signal_start (struct ev_signal *w)
 {
@@ -1027,7 +1055,7 @@ ev_signal_start (struct ev_signal *w)
       struct sigaction sa;
       sa.sa_handler = sighandler;
       sigfillset (&sa.sa_mask);
       struct sigaction sa;
       sa.sa_handler = sighandler;
       sigfillset (&sa.sa_mask);
-      sa.sa_flags = 0;
+      sa.sa_flags = SA_RESTART; /* if restarting works we save one iteration */
       sigaction (w->signum, &sa, 0);
     }
 }
       sigaction (w->signum, &sa, 0);
     }
 }