diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-09-05 17:18:23 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-09-05 17:18:23 +0000 |
commit | b051fc4438e7e7ef248a1d03a9b2bd397bc916f3 (patch) | |
tree | 0d6d7a6030bafb9f43c5cc2f0a32a1d49a0e7626 /nptl/pthread_create.c | |
parent | d052233c6cc886f472736f3cd8f79e4ecf6e0c89 (diff) | |
download | glibc-b051fc4438e7e7ef248a1d03a9b2bd397bc916f3.tar.gz glibc-b051fc4438e7e7ef248a1d03a9b2bd397bc916f3.tar.xz glibc-b051fc4438e7e7ef248a1d03a9b2bd397bc916f3.zip |
[BZ #3124]
2006-09-05 Ulrich Drepper <drepper@redhat.com> [BZ #3124] * descr.h (struct pthread): Add parent_cancelhandling. * sysdeps/pthread/createthread.c (create_thread): Pass parent cancelhandling value to child. * pthread_create.c (start_thread): If parent thread was canceled reset the SIGCANCEL mask. * Makefile (tests): Add tst-cancel25. * tst-cancel25.c: New file.
Diffstat (limited to 'nptl/pthread_create.c')
-rw-r--r-- | nptl/pthread_create.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 315722643b..79729ced03 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -251,6 +251,19 @@ start_thread (void *arg) } #endif + /* If the parent was running cancellation handlers while creating + the thread the new thread inherited the signal mask. Reset the + cancellation signal mask. */ + if (__builtin_expect (pd->parent_cancelhandling & CANCELING_BITMASK, 0)) + { + INTERNAL_SYSCALL_DECL (err); + sigset_t mask; + __sigemptyset (&mask); + __sigaddset (&mask, SIGCANCEL); + (void) INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_UNBLOCK, &mask, + NULL, _NSIG / 8); + } + /* This is where the try/finally block should be created. For compilers without that support we do use setjmp. */ struct pthread_unwind_buf unwind_buf; |