summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog9
-rw-r--r--winsup/cygwin/include/sys/cygwin.h3
-rw-r--r--winsup/cygwin/signal.cc8
-rw-r--r--winsup/cygwin/sigproc.cc1
4 files changed, 16 insertions, 5 deletions
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 <me.cygwin2011@cgf.cx>
+
+ * 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 <yselkowitz@users.sourceforge.net>
* 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);