diff options
author | Ulrich Drepper <drepper@redhat.com> | 2001-11-28 22:27:20 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2001-11-28 22:27:20 +0000 |
commit | cf6a2367e82ba5b322baf0fc0caa5d57e799c72d (patch) | |
tree | 6231ff95b897d8af2428dbe041a30ad022acd35a /linuxthreads/manager.c | |
parent | 4e735c9aaf9e05a1d4f587f5b049b2f515ff755a (diff) | |
download | glibc-cf6a2367e82ba5b322baf0fc0caa5d57e799c72d.tar glibc-cf6a2367e82ba5b322baf0fc0caa5d57e799c72d.tar.gz glibc-cf6a2367e82ba5b322baf0fc0caa5d57e799c72d.tar.bz2 glibc-cf6a2367e82ba5b322baf0fc0caa5d57e799c72d.zip |
Update.
2001-11-22 Wolfram Gloger <wg@malloc.de>
* pthread.c (pthread_onexit_process): Don't call free
after threads have been asynchronously terminated.
* manager.c (pthread_handle_exit): Surround cancellation
of threads with __flockfilelist()/__funlockfilelist().
Diffstat (limited to 'linuxthreads/manager.c')
-rw-r--r-- | linuxthreads/manager.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c index c8808197c1..0872146e3f 100644 --- a/linuxthreads/manager.c +++ b/linuxthreads/manager.c @@ -909,6 +909,12 @@ static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode) pthread_descr th; __pthread_exit_requested = 1; __pthread_exit_code = exitcode; + /* A forced asynchronous cancellation follows. Make sure we won't + get stuck later in the main thread with a system lock being held + by one of the cancelled threads. Ideally one would use the same + code as in pthread_atfork(), but we can't distinguish system and + user handlers there. */ + __flockfilelist(); /* Send the CANCEL signal to all running threads, including the main thread, but excluding the thread from which the exit request originated (that thread must complete the exit, e.g. calling atexit functions @@ -925,6 +931,7 @@ static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode) th = th->p_nextlive) { waitpid(th->p_pid, NULL, __WCLONE); } + __fresetlockfiles(); restart(issuing_thread); _exit(0); } |