Update.
authorUlrich Drepper <drepper@redhat.com>
Thu, 30 Apr 1998 10:14:00 +0000 (10:14 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 30 Apr 1998 10:14:00 +0000 (10:14 +0000)
1998-04-30  Ulrich Drepper  <drepper@cygnus.com>

* manager.c (pthread_free): Detect already free child.
Patch by Xavier Leroy, reported by Matthias Urlichs.

linuxthreads/ChangeLog
linuxthreads/manager.c

index e875474..4f0c67e 100644 (file)
@@ -1,3 +1,8 @@
+1998-04-30  Ulrich Drepper  <drepper@cygnus.com>
+
+       * manager.c (pthread_free): Detect already free child.
+       Patch by Xavier Leroy, reported by Matthias Urlichs.
+
 1998-04-23  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
 
        * Makefile (linuxthreads-version): Renamed back from
index 8844dec..993df00 100644 (file)
@@ -308,10 +308,22 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
 }
 
 
-/* Free the resources of a thread. */
+/* Try to free the resources of a thread when requested by pthread_join
+   or pthread_detach on a terminated thread. */
 
 static void pthread_free(pthread_descr th)
 {
+  pthread_descr t;
+
+  /* Check that the thread th is still there -- pthread_reap_children
+     might have deallocated it already */
+  t = __pthread_main_thread;
+  do {
+    if (t == th) break;
+    t = t->p_nextlive;
+  } while (t != __pthread_main_thread);
+  if (t != th) return;
+
   pthread_handle handle;
   ASSERT(th->p_exited);
   /* Make the handle invalid */