OSDN Git Service

* signal.cc (_pinfo::kill): Return 0 when attempting to test for existence of
authorcgf <cgf>
Sun, 17 Apr 2011 21:45:27 +0000 (21:45 +0000)
committercgf <cgf>
Sun, 17 Apr 2011 21:45:27 +0000 (21:45 +0000)
an existed process which has not yet been reaped.

winsup/cygwin/ChangeLog
winsup/cygwin/signal.cc

index c070633..3530834 100644 (file)
@@ -1,5 +1,10 @@
 2011-04-17  Christopher Faylor  <me.cygwin2011@cgf.cx>
 
+       * signal.cc (_pinfo::kill): Return 0 when attempting to test for
+       existence of an existed process which has not yet been reaped.
+
+2011-04-17  Christopher Faylor  <me.cygwin2011@cgf.cx>
+
        * cygheap.h (init_cygheap::ctty): Use base class so that console can
        join in the fun.
        * dtable.cc (dtable::stdio_init): Remove special-case call to
index 615104e..41eb03e 100644 (file)
@@ -221,34 +221,42 @@ handle_sigprocmask (int how, const sigset_t *set, sigset_t *oldset, sigset_t& op
 int __stdcall
 _pinfo::kill (siginfo_t& si)
 {
-  sig_dispatch_pending ();
+  int res;
+  DWORD this_process_state;
 
-  int res = 0;
-  bool sendSIGCONT;
+  sig_dispatch_pending ();
 
-  if (!exists ())
+  if (exists ())
     {
-      set_errno (ESRCH);
-      return -1;
-    }
+      bool sendSIGCONT;
+      if ((sendSIGCONT = (si.si_signo < 0)))
+       si.si_signo = -si.si_signo;
 
-  if ((sendSIGCONT = (si.si_signo < 0)))
-    si.si_signo = -si.si_signo;
-
-  DWORD this_process_state = process_state;
-  if (si.si_signo == 0)
-    /* ok */;
-  else if ((res = sig_send (this, si)))
+      if (si.si_signo == 0)
+       res = 0;
+      else if ((res = sig_send (this, si)))
+       {
+         sigproc_printf ("%d = sig_send, %E ", res);
+         res = -1;
+       }
+      else if (sendSIGCONT)
+       {
+         siginfo_t si2 = {0};
+         si2.si_signo = SIGCONT;
+         si2.si_code = SI_KERNEL;
+         sig_send (this, si2);
+       }
+    }
+  else if (si.si_signo == 0 && this)
     {
-      sigproc_printf ("%d = sig_send, %E ", res);
-      res = -1;
+      this_process_state = process_state;
+      res = 0;
     }
-  else if (sendSIGCONT)
+  else
     {
-      siginfo_t si2 = {0};
-      si2.si_signo = SIGCONT;
-      si2.si_code = SI_KERNEL;
-      sig_send (this, si2);
+      set_errno (ESRCH);
+      this_process_state = 0;
+      res = -1;
     }
 
   syscall_printf ("%d = _pinfo::kill (%d, %d), process_state %p", res, pid,