]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
[BZ #530]
authorRoland McGrath <roland@gnu.org>
Tue, 9 Nov 2004 21:52:49 +0000 (21:52 +0000)
committerRoland McGrath <roland@gnu.org>
Tue, 9 Nov 2004 21:52:49 +0000 (21:52 +0000)
2004-11-09  Roland McGrath  <roland@redhat.com>
[BZ #530]
* sysdeps/pthread/createthread.c (do_clone): Increment __nptl_nthreads
here, before calling clone.
* pthread_create.c (start_thread): Don't do it here.

nptl/pthread_create.c
nptl/sysdeps/pthread/createthread.c

index 7293f4c71cf5262094f4f5f89878e984ded9343f..82a3c683aaaf0df6bfabf7d7553edabe1672636a 100644 (file)
@@ -222,9 +222,6 @@ __free_tcb (struct pthread *pd)
 static int
 start_thread (void *arg)
 {
-  /* One more thread.  */
-  atomic_increment (&__nptl_nthreads);
-
   struct pthread *pd = (struct pthread *) arg;
 
 #if HP_TIMING_AVAIL
index 8620519887b33f618f2f792eee7e4fa6bab8548b..25a2703ae139581bebbcd805bddc312ac27f3540 100644 (file)
@@ -64,9 +64,21 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
        until we tell it to.  */
     lll_lock (pd->lock);
 
+  /* One more thread.  We cannot have the thread do this itself, since it
+     might exist but not have been scheduled yet by the time we've returned
+     and need to check the value to behave correctly.  We must do it before
+     creating the thread, in case it does get scheduled first and then
+     might mistakenly think it was the only thread.  In the failure case,
+     we momentarily store a false value; this doesn't matter because there
+     is no kosher thing a signal handler interrupting us right here can do
+     that cares whether the thread count is correct.  */
+  atomic_increment (&__nptl_nthreads);
+
   if (ARCH_CLONE (fct, STACK_VARIABLES_ARGS, clone_flags,
                  pd, &pd->tid, TLS_VALUE, &pd->tid) == -1)
     {
+      atomic_decrement (&__nptl_nthreads); /* Oops, we lied for a second.  */
+
       /* Failed.  If the thread is detached, remove the TCB here since
         the caller cannot do this.  The caller remembered the thread
         as detached and cannot reverify that it is not since it must