diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-08-04 21:53:09 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-08-04 21:53:09 +0000 |
commit | 9c988b83bcd33915c59ab347921086c07d11f471 (patch) | |
tree | 5bfba6edf69fe3c6a5426396194629da375fc735 | |
parent | f1205aa71fb0131eb9d1e2efdd5fbcfaa85ad27c (diff) | |
download | glibc-9c988b83bcd33915c59ab347921086c07d11f471.tar glibc-9c988b83bcd33915c59ab347921086c07d11f471.tar.gz glibc-9c988b83bcd33915c59ab347921086c07d11f471.tar.bz2 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.
-rw-r--r-- | nptl/ChangeLog | 6 | ||||
-rw-r--r-- | nptl/sysdeps/pthread/createthread.c | 30 |
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 |