mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-13 08:40:07 +00:00
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().
This commit is contained in:
parent
4e735c9aaf
commit
cf6a2367e8
@ -1,3 +1,11 @@
|
|||||||
|
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>
|
2001-11-26 Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
* manager.c (pthread_handle_create): Start the child thread with
|
* manager.c (pthread_handle_create): Start the child thread with
|
||||||
|
@ -909,6 +909,12 @@ static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode)
|
|||||||
pthread_descr th;
|
pthread_descr th;
|
||||||
__pthread_exit_requested = 1;
|
__pthread_exit_requested = 1;
|
||||||
__pthread_exit_code = exitcode;
|
__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
|
/* Send the CANCEL signal to all running threads, including the main
|
||||||
thread, but excluding the thread from which the exit request originated
|
thread, but excluding the thread from which the exit request originated
|
||||||
(that thread must complete the exit, e.g. calling atexit functions
|
(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) {
|
th = th->p_nextlive) {
|
||||||
waitpid(th->p_pid, NULL, __WCLONE);
|
waitpid(th->p_pid, NULL, __WCLONE);
|
||||||
}
|
}
|
||||||
|
__fresetlockfiles();
|
||||||
restart(issuing_thread);
|
restart(issuing_thread);
|
||||||
_exit(0);
|
_exit(0);
|
||||||
}
|
}
|
||||||
|
@ -795,7 +795,9 @@ static void pthread_onexit_process(int retcode, void *arg)
|
|||||||
if (self == __pthread_main_thread)
|
if (self == __pthread_main_thread)
|
||||||
{
|
{
|
||||||
waitpid(__pthread_manager_thread.p_pid, NULL, __WCLONE);
|
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;
|
__pthread_manager_thread_bos = __pthread_manager_thread_tos = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user