summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/signal.cc50
2 files changed, 34 insertions, 21 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index c07063386..3530834cf 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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
diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc
index 615104e80..41eb03ec5 100644
--- a/winsup/cygwin/signal.cc
+++ b/winsup/cygwin/signal.cc
@@ -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,