From: Ulrich Drepper Date: Mon, 4 Aug 2003 21:53:09 +0000 (+0000) Subject: Update. X-Git-Tag: cvs/glibc-2_3_3~380 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9c988b83bcd33915c59ab347921086c07d11f471;p=thirdparty%2Fglibc.git Update. 2003-08-03 Jakub Jelinek * 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. --- diff --git a/nptl/ChangeLog b/nptl/ChangeLog index a8b7d743c09..d68c12e274f 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,9 @@ +2003-08-03 Jakub Jelinek + + * 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 * 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 23012bb476c..373a21fe6ec 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