From: Julian Seward Date: Wed, 18 Sep 2002 15:27:54 +0000 (+0000) Subject: Regression test for bug where pthread_kill will deliver a signal to a X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5d855b0b62a9925bcc0dde81ed3e9ef41edc86c0;p=thirdparty%2Fvalgrind.git Regression test for bug where pthread_kill will deliver a signal to a thread even though that thread has the signal blocked. MERGE TO ERASER git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_1_0_BRANCH@1076 --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 38396140c8..00dab8a537 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -31,4 +31,5 @@ EXTRA_DIST = \ discard.c pth_semaphore1.c new_override.cpp pth_yield.c \ sigaltstack.c erringfds.c sigwait_all.c \ pth_cancel1.c pth_cancel2.c pth_signal_gober.c nanoleak.c \ - pth_pause.c pth_sigpending.c pth_atfork1.c + pth_pause.c pth_sigpending.c pth_atfork1.c \ + fpu_28_108.S pth_blockedsig.c diff --git a/tests/pth_blockedsig.c b/tests/pth_blockedsig.c new file mode 100644 index 0000000000..7699e65b5e --- /dev/null +++ b/tests/pth_blockedsig.c @@ -0,0 +1,64 @@ + +#include +#include +#include +#include +#include +#include +#include + +static void sig_usr1(int); + +static pthread_t main_thread; + +void * +child_main(void *no_args) +{ + int i; + + for (i = 0; i < 5; ++i) + { + sleep (1); + fprintf (stdout, "thread %ld sending SIGUSR1 to thread %ld\n", + pthread_self (), main_thread); + if (pthread_kill (main_thread, SIGUSR1) != 0) + fprintf (stderr, "error doing pthread_kill\n"); + } + + return no_args; +} + +int +main(void) +{ + struct sigaction sigact; + sigset_t newmask, oldmask; + pthread_t child; + + memset(&newmask, 0, sizeof newmask); + sigemptyset (&newmask); + sigaddset (&newmask, SIGUSR1); + + if (pthread_sigmask (SIG_BLOCK, &newmask, &oldmask) != 0) + fprintf (stderr, "SIG_BLOCK error"); + + memset (&sigact, 0, sizeof sigact); + sigact.sa_handler = sig_usr1; + if (sigaction(SIGUSR1, &sigact, NULL) != 0) + fprintf (stderr, "signal(SIGINT) error"); + + main_thread = pthread_self (); + if (pthread_create (&child, NULL, child_main, NULL) != 0) + fprintf (stderr, "error creating thread"); + + pthread_join (child, NULL); + + exit(0); +} + +static void +sig_usr1 (int signo) +{ + fprintf (stderr, "SHOULD NOT BE HERE (SIGUSR1)!!!!\n"); + return; +}