This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

pthread_key_delete


pthread_key_delete should not try to contact the thread manager if that
does not exist yet.  Otherwise this program hangs:

#include <pthread.h>
#include <stdio.h>

int
main ()
{
  pthread_key_t k;

  pthread_key_create (&k, NULL);
  pthread_key_delete (k);
  return 0;
}

Andreas.


2001-12-13  Andreas Schwab  <schwab@suse.de>

	* specific.c (pthread_key_delete): Don't contact the thread
	manager if no threads have been created yet.

--- specific.c.~1.13.~	Thu Nov 29 10:40:10 2001
+++ specific.c	Thu Dec 13 10:26:16 2001
@@ -102,25 +102,28 @@
 
   /* Set the value of the key to NULL in all running threads, so
      that if the key is reallocated later by pthread_key_create, its
-     associated values will be NULL in all threads. */
+     associated values will be NULL in all threads.
 
-  {
-    struct pthread_key_delete_helper_args args;
-    struct pthread_request request;
-
-    args.idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE;
-    args.idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
-    args.self = 0;
-
-    request.req_thread = self;
-    request.req_kind = REQ_FOR_EACH_THREAD;
-    request.req_args.for_each.arg = &args;
-    request.req_args.for_each.fn = pthread_key_delete_helper;
-
-    TEMP_FAILURE_RETRY(__libc_write(__pthread_manager_request,
-				    (char *) &request, sizeof(request)));
-    suspend(self);
-  }
+     Do nothing if no threads have been created yet.  */
+
+  if (__pthread_manager_request != -1)
+    {
+      struct pthread_key_delete_helper_args args;
+      struct pthread_request request;
+
+      args.idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE;
+      args.idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
+      args.self = 0;
+
+      request.req_thread = self;
+      request.req_kind = REQ_FOR_EACH_THREAD;
+      request.req_args.for_each.arg = &args;
+      request.req_args.for_each.fn = pthread_key_delete_helper;
+
+      TEMP_FAILURE_RETRY(__libc_write(__pthread_manager_request,
+				      (char *) &request, sizeof(request)));
+      suspend(self);
+    }
 
   pthread_mutex_unlock(&pthread_keys_mutex);
   return 0;

-- 
Andreas Schwab                                  "And now for something
Andreas.Schwab@suse.de				completely different."
SuSE Labs, SuSE GmbH, Schanzäckerstr. 10, D-90443 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]