+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().
+
2001-11-26 Andreas Schwab <schwab@suse.de>
* manager.c (pthread_handle_create): Start the child thread with
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
th = th->p_nextlive) {
waitpid(th->p_pid, NULL, __WCLONE);
}
+ __fresetlockfiles();
restart(issuing_thread);
_exit(0);
}
if (self == __pthread_main_thread)
{
waitpid(__pthread_manager_thread.p_pid, NULL, __WCLONE);
- free (__pthread_manager_thread_bos);
+ /* Since all threads have been asynchronously terminated
+ (possibly holding locks), free cannot be used any more. */
+ /*free (__pthread_manager_thread_bos);*/
__pthread_manager_thread_bos = __pthread_manager_thread_tos = NULL;
}
}