From: Ulrich Drepper Date: Tue, 21 Mar 2000 05:07:44 +0000 (+0000) Subject: (pthread_initialize): Instead of on_exit use __cxa_atexit if __dso_label is X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06c07ea152c5104a132320db21b2d3e87afbff61;p=thirdparty%2Fglibc.git (pthread_initialize): Instead of on_exit use __cxa_atexit if __dso_label is available to allow unloading the libpthread shared library. --- diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c index 0dfdf693b80..6a6d915d18f 100644 --- a/linuxthreads/pthread.c +++ b/linuxthreads/pthread.c @@ -298,6 +298,8 @@ __libc_allocate_rtsig (int high) static void pthread_initialize(void) __attribute__((constructor)); +extern void *__dso_handle __attribute__ ((weak)); + static void pthread_initialize(void) { struct sigaction sa; @@ -370,7 +372,13 @@ static void pthread_initialize(void) /* Register an exit function to kill all other threads. */ /* Do it early so that user-registered atexit functions are called before pthread_exit_process. */ - __on_exit(pthread_exit_process, NULL); + if (__dso_handle) + /* The cast is a bit unclean. The function expects two arguments but + we can only pass one. Fortunately this is not a problem since the + second argument of `pthread_exit_process' is simply ignored. */ + __cxa_atexit((void (*) (void *)) pthread_exit_process, NULL, __dso_handle); + else + on_exit (pthread_exit_process, NULL); } void __pthread_initialize(void)