about summary refs log tree commit diff
path: root/nptl
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-08-04 21:53:09 +0000
committerUlrich Drepper <drepper@redhat.com>2003-08-04 21:53:09 +0000
commit9c988b83bcd33915c59ab347921086c07d11f471 (patch)
tree5bfba6edf69fe3c6a5426396194629da375fc735 /nptl
parentf1205aa71fb0131eb9d1e2efdd5fbcfaa85ad27c (diff)
downloadglibc-9c988b83bcd33915c59ab347921086c07d11f471.tar.gz
glibc-9c988b83bcd33915c59ab347921086c07d11f471.tar.xz
glibc-9c988b83bcd33915c59ab347921086c07d11f471.zip
Update.
2003-08-03  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/pthread/createthread.c (do_clone): Move error handling
	to first syscall error check.  Move syscall error check for tkill
	into __ASSUME_CLONE_STOPPED #ifdef.
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog6
-rw-r--r--nptl/sysdeps/pthread/createthread.c30
2 files changed, 21 insertions, 15 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index a8b7d743c0..d68c12e274 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,9 @@
+2003-08-03  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/pthread/createthread.c (do_clone): Move error handling
+	to first syscall error check.  Move syscall error check for tkill
+	into __ASSUME_CLONE_STOPPED #ifdef.
+
 2003-08-02  Ulrich Drepper  <drepper@redhat.com>
 
 	* sysdeps/pthread/createthread.c (do_clone): If __ASSUME_CLONE_STOPPED
diff --git a/nptl/sysdeps/pthread/createthread.c b/nptl/sysdeps/pthread/createthread.c
index 23012bb476..373a21fe6e 100644
--- a/nptl/sysdeps/pthread/createthread.c
+++ b/nptl/sysdeps/pthread/createthread.c
@@ -88,7 +88,20 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
 				  sizeof (cpu_set_t), attr->cpuset);
 
 	  if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
-	    goto err_out;
+	    {
+	      /* The operation failed.  We have to kill the thread.  First
+		 send it the cancellation signal.  */
+	      INTERNAL_SYSCALL_DECL (err2);
+	    err_out:
+	      (void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCANCEL);
+
+#ifdef __ASSUME_CLONE_STOPPED
+	      /* Then wake it up so that the signal can be processed.  */
+	      (void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCONT);
+#endif
+
+	      return INTERNAL_SYSCALL_ERRNO (res, err);
+	    }
 	}
 
       /* Set the scheduling parameters.  */
@@ -104,24 +117,11 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
 #ifdef __ASSUME_CLONE_STOPPED
       /* Now start the thread for real.  */
       res = INTERNAL_SYSCALL (tkill, err, 2, pd->tid, SIGCONT);
-#endif
 
       /* If something went wrong, kill the thread.  */
       if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
-	{
-	  /* The operation failed.  We have to kill the thread.  First
-             send it the cancellation signal.  */
-	  INTERNAL_SYSCALL_DECL (err2);
-	err_out:
-	  (void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCANCEL);
-
-#ifdef __ASSUME_CLONE_STOPPED
-	  /* Then wake it up so that the signal can be processed.  */
-	  (void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCONT);
+	goto err_out;
 #endif
-
-	  return INTERNAL_SYSCALL_ERRNO (res, err);
-	}
     }
 
   /* We now have for sure more than one thread.  The main thread might