aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2008-02-14 14:23:51 +0000
committerCorinna Vinschen <corinna@vinschen.de>2008-02-14 14:23:51 +0000
commitdfb28cbab77bc95f9d6df8c81ca529c1fe9dd48f (patch)
tree109dc89a509e32b1739b287ba95480ba9368f893
parent7c25e1f0e3f541c22f6e59a9c0dbd68f48e3a5a7 (diff)
downloadnewlib-dfb28cbab77bc95f9d6df8c81ca529c1fe9dd48f.zip
newlib-dfb28cbab77bc95f9d6df8c81ca529c1fe9dd48f.tar.gz
newlib-dfb28cbab77bc95f9d6df8c81ca529c1fe9dd48f.tar.bz2
* thread.cc (pthread_kill): Deal with signal 0 as per POSIX and also
avoid manipulating an invalid thread.
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/thread.cc20
2 files changed, 23 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 66da517..8494c22 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,8 @@
+2008-02-13 Christopher Faylor <me+cygwin@cgf.cx>
+
+ * thread.cc (pthread_kill): Deal with signal 0 as per POSIX and also
+ avoid manipulating an invalid thread.
+
2008-02-13 Corinna Vinschen <corinna@vinschen.de>
* cygtls.cc (_cygtls::init_exception_handler): Revert patch
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index 73bb9b1..f5226a5 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -2811,8 +2811,24 @@ pthread_kill (pthread_t thread, int sig)
si.si_code = SI_USER;
si.si_pid = myself->pid;
si.si_uid = myself->uid;
- thread->cygtls->set_threadkill ();
- int rval = sig ? sig_send (NULL, si, thread->cygtls) : 0;
+ int rval;
+ if (!thread->valid)
+ rval = ESRCH;
+ else if (sig)
+ {
+ thread->cygtls->set_threadkill ();
+ rval = sig_send (NULL, si, thread->cygtls);
+ }
+ else
+ switch (WaitForSingleObject (thread->win32_obj_id, 0))
+ {
+ case WAIT_TIMEOUT:
+ rval = 0;
+ break;
+ default:
+ rval = ESRCH;
+ break;
+ }
// unlock myself
return rval;