Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 20 Mar 2000 07:07:18 +0000 (07:07 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 20 Mar 2000 07:07:18 +0000 (07:07 +0000)
* include/stdlib.h: Add prototype for __cxa_atexit.

ChangeLog
include/stdlib.h
linuxthreads/ChangeLog
linuxthreads/pthread.c

index 22e440a..10fe7e4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2000-03-19  Ulrich Drepper  <drepper@redhat.com>
 
+       * include/stdlib.h: Add prototype for __cxa_atexit.
+
        * sysdeps/unix/sysv/linux/i386/sys/debugreg.h: Update comment about
        _SLOWDOWN flags.  Patch by Jim Blandy <jimb@cygnus.com>.
 
index 38fd33d..edca200 100644 (file)
@@ -53,6 +53,8 @@ extern int __add_to_environ (const char *name, const char *value,
 extern void _quicksort (void *const pbase, size_t total_elems,
                        size_t size, __compar_fn_t cmp);
 
+extern int __cxa_atexit (void (*func) (void *), void *arg, void *d);
+
 #endif
 #undef __Need_M_And_C
 
index bb31553..ce335a7 100644 (file)
@@ -1,3 +1,9 @@
+2000-03-19  Ulrich Drepper  <drepper@redhat.com>
+
+       * pthread.c (pthread_initialize): Instead of on_exit use
+       __cxa_atexit if __dso_label is available to allow unloading the
+       libpthread shared library.
+
 2000-03-16  Ulrich Drepper  <drepper@redhat.com>
 
        * condvar.c: Make tests for ownership of mutex less strict.
index 5884b9b..57bc15e 100644 (file)
@@ -308,6 +308,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;
@@ -387,7 +389,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)