diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2008-02-14 14:23:51 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2008-02-14 14:23:51 +0000 |
commit | dfb28cbab77bc95f9d6df8c81ca529c1fe9dd48f (patch) | |
tree | 109dc89a509e32b1739b287ba95480ba9368f893 | |
parent | 7c25e1f0e3f541c22f6e59a9c0dbd68f48e3a5a7 (diff) | |
download | newlib-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/ChangeLog | 5 | ||||
-rw-r--r-- | winsup/cygwin/thread.cc | 20 |
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; |