From 9c988b83bcd33915c59ab347921086c07d11f471 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 4 Aug 2003 21:53:09 +0000 Subject: [PATCH] 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. --- nptl/ChangeLog | 6 ++++++ nptl/sysdeps/pthread/createthread.c | 30 +++++++++++++++--------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/nptl/ChangeLog b/nptl/ChangeLog index a8b7d74..d68c12e 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 23012bb..373a21f 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 -- 2.7.4