(start_thread): Don't wait for scheduler data etc to be set at the
authordrepper <drepper>
Fri, 24 Sep 2004 07:17:52 +0000 (07:17 +0000)
committerdrepper <drepper>
Fri, 24 Sep 2004 07:17:52 +0000 (07:17 +0000)
beginning of the function.  The cancellation infrastructure must have
been set up.  And enable async cancellation before potentially going
to sleep.

nptl/pthread_create.c

index 1606568..1430686 100644 (file)
@@ -227,11 +227,6 @@ start_thread (void *arg)
 
   struct pthread *pd = (struct pthread *) arg;
 
-  /* Get the lock the parent locked to force synchronization.  */
-  lll_lock (pd->lock);
-  /* And give it up right away.  */
-  lll_unlock (pd->lock);
-
 #if HP_TIMING_AVAIL
   /* Remember the time when the thread was started.  */
   hp_timing_t now;
@@ -257,6 +252,15 @@ start_thread (void *arg)
       /* Store the new cleanup handler info.  */
       THREAD_SETMEM (pd, cleanup_jmp_buf, &unwind_buf);
 
+      int oldtype = CANCEL_ASYNC ();
+
+      /* Get the lock the parent locked to force synchronization.  */
+      lll_lock (pd->lock);
+      /* And give it up right away.  */
+      lll_unlock (pd->lock);
+
+      CANCEL_RESET (oldtype);
+
       /* Run the code the user provided.  */
 #ifdef CALL_THREAD_FCT
       THREAD_SETMEM (pd, result, CALL_THREAD_FCT (pd));