diff options
author | Christopher Faylor <me@cgf.cx> | 2002-10-14 03:51:44 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2002-10-14 03:51:44 +0000 |
commit | 969203ce911a958c9b41ab934334c48bd15df7e0 (patch) | |
tree | 498582ade58561d078daad2659014646941ade0c /winsup/cygwin/cygthread.cc | |
parent | a7a5d0ba3742911e0ab9dfeed077631f25bb257f (diff) | |
download | cygnal-969203ce911a958c9b41ab934334c48bd15df7e0.tar.gz cygnal-969203ce911a958c9b41ab934334c48bd15df7e0.tar.bz2 cygnal-969203ce911a958c9b41ab934334c48bd15df7e0.zip |
* cygthread.cc (cygthread::stub): Reintroduce clearing of __name but do it
before SetEvent to eliminate a race.
(cygthread::terminate): Accumulate list of threads to check for termination and
call WaitForMultipleObjects on list rather than waiting for each thread
individually.
* sigproc.cc (subproc_init): Zap hwait_subproc thread handle since it is no
longer used.
* spawn.cc (spawn_guts): Fix so that cygthread::terminate is *really* called
only for exec.
Diffstat (limited to 'winsup/cygwin/cygthread.cc')
-rw-r--r-- | winsup/cygwin/cygthread.cc | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/winsup/cygwin/cygthread.cc b/winsup/cygwin/cygthread.cc index ce64a746c..d4295e61b 100644 --- a/winsup/cygwin/cygthread.cc +++ b/winsup/cygwin/cygthread.cc @@ -58,6 +58,7 @@ cygthread::stub (VOID *arg) #ifdef DEBUGGING info->func = NULL; // catch erroneous activation #endif + info->__name = NULL; SetEvent (info->ev); } switch (WaitForSingleObject (info->thread_sync, INFINITE)) @@ -313,15 +314,19 @@ cygthread::terminate () (void) TerminateThread (runner_handle, 0); (void) WaitForSingleObject (runner_handle, INFINITE); (void) CloseHandle (runner_handle); + HANDLE hthreads[NTHREADS]; + int n = 0; for (unsigned i = 0; i < NTHREADS; i++) if (threads[i].h) { + hthreads[n++] = threads[i].h; TerminateThread (threads[i].h, 0); - (void) WaitForSingleObject (threads[i].h, INFINITE); - (void) CloseHandle (threads[i].h); -#ifdef DEBUGGING - threads[i].h = NULL; -#endif } + if (n) + { + (void) WaitForMultipleObjects (n, hthreads, TRUE, INFINITE); + while (--n >= 0) + CloseHandle (hthreads[n]); + } } } |