From: Christopher Faylor Date: Thu, 5 May 2011 00:31:22 +0000 (+0000) Subject: * signal.cc (_pinfo::kill): Return success on kill(0) only if pid exists or is X-Git-Tag: sid-snapshot-20110601~123 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=5069a2b0d9533b36f55928728d1b1bffedc43545;p=newlib-cygwin.git * signal.cc (_pinfo::kill): Return success on kill(0) only if pid exists or is in PID_EXITED state. Report pid 0 when pid does not exist rather than pid -1. Make debug output reflect actual function call. * sigproc.cc (stopped_or_terminated): Set process state to reaped when we've finished waiting for it. * include/sys/cygwin.h (PID_REAPED): New enum. --- diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index bc7053240..7daf6051e 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +2011-05-04 Christopher Faylor + + * signal.cc (_pinfo::kill): Return success on kill(0) only if pid + exists or is in PID_EXITED state. Report pid 0 when pid does not exist + rather than pid -1. Make debug output reflect actual function call. + * sigproc.cc (stopped_or_terminated): Set process state to reaped when + we've finished waiting for it. + * include/sys/cygwin.h (PID_REAPED): New enum. + 2011-05-04 Yaakov Selkowitz * cygwin.din (psiginfo): Export. diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h index a6e63b282..7e856cd9b 100644 --- a/winsup/cygwin/include/sys/cygwin.h +++ b/winsup/cygwin/include/sys/cygwin.h @@ -168,7 +168,8 @@ enum PID_ALLPIDS = 0x02000, /* used by pinfo scanner */ PID_EXECED = 0x04000, /* redirect to original pid info block */ PID_NOREDIR = 0x08000, /* don't redirect if execed */ - PID_EXITED = 0x80000000 /* Free entry. */ + PID_EXITED = 0x40000000, /* Free entry. */ + PID_REAPED = 0x80000000 /* Reaped */ }; #ifdef WINVER diff --git a/winsup/cygwin/signal.cc b/winsup/cygwin/signal.cc index 78b0f1d5b..8d9f592a4 100644 --- a/winsup/cygwin/signal.cc +++ b/winsup/cygwin/signal.cc @@ -250,7 +250,7 @@ _pinfo::kill (siginfo_t& si) } this_pid = pid; } - else if (si.si_signo == 0 && this) + else if (si.si_signo == 0 && this && process_state == PID_EXITED) { this_process_state = process_state; this_pid = pid; @@ -260,12 +260,12 @@ _pinfo::kill (siginfo_t& si) { set_errno (ESRCH); this_process_state = 0; - this_pid = -1; + this_pid = 0; res = -1; } - syscall_printf ("%d = _pinfo::kill (%d, %d), process_state %p", res, this_pid, - si.si_signo, this_process_state); + syscall_printf ("%d = _pinfo::kill (%d), pid %d, process_state %p", res, + si.si_signo, this_pid, this_process_state); return res; } diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 2d2db78a4..43655dc4c 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -1041,6 +1041,7 @@ stopped_or_terminated (waitq *parent_w, _pinfo *child) } else { + child->process_state = PID_REAPED; w->status = (__uint16_t) child->exitcode; add_rusage (&myself->rusage_children, &child->rusage_children);