From b051fc4438e7e7ef248a1d03a9b2bd397bc916f3 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 5 Sep 2006 17:18:23 +0000 Subject: [BZ #3124] 2006-09-05 Ulrich Drepper [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. --- nptl/pthread_create.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'nptl/pthread_create.c') 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; -- cgit 1.4.1