From ae41d0613ce5e8e7a282f73df76374c910448ac1 Mon Sep 17 00:00:00 2001 From: Marco S Hyman Date: Mon, 21 Oct 2002 18:46:36 +0000 Subject: Add test for non-deferred signal handling in threads. pthreads code that makes this test work is being tested. --- regress/lib/libpthread/signodefer/Makefile | 5 ++ regress/lib/libpthread/signodefer/signodefer.c | 67 ++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 regress/lib/libpthread/signodefer/Makefile create mode 100644 regress/lib/libpthread/signodefer/signodefer.c (limited to 'regress/lib/libpthread') diff --git a/regress/lib/libpthread/signodefer/Makefile b/regress/lib/libpthread/signodefer/Makefile new file mode 100644 index 00000000000..52c04c28cd2 --- /dev/null +++ b/regress/lib/libpthread/signodefer/Makefile @@ -0,0 +1,5 @@ +# $OpenBSD: Makefile,v 1.1 2002/10/21 18:46:35 marc Exp $ + +PROG= signodefer + +.include diff --git a/regress/lib/libpthread/signodefer/signodefer.c b/regress/lib/libpthread/signodefer/signodefer.c new file mode 100644 index 00000000000..dbc0561cac8 --- /dev/null +++ b/regress/lib/libpthread/signodefer/signodefer.c @@ -0,0 +1,67 @@ +/* $OpenBSD: signodefer.c,v 1.1 2002/10/21 18:46:35 marc Exp $ */ +/* PUBLIC DOMAIN Oct 2002 */ + +/* + * test signal delivery of active signals (SA_NODEFER) + */ + +#include +#include +#include + +#include "test.h" + +volatile sig_atomic_t sigactive; +volatile sig_atomic_t sigcount; +volatile sig_atomic_t was_active; + +void +act_handler(int signal, siginfo_t *siginfo, void *context) +{ + char *str; + + /* how many times has the handler been called */ + was_active += sigactive++; + sigcount += 1; + + /* verify siginfo since we asked for it. */ + ASSERT(siginfo != NULL); + + asprintf(&str, + "%sact_handler/%d, signal %d, siginfo 0x%p, context 0x%p\n", + was_active ? "[recurse] " : "", + sigcount, signal, siginfo, context); + CHECKe(write(STDOUT_FILENO, str, strlen(str))); + /* Odd times entered send ourself the same signal */ + if (sigcount & 1) + CHECKe(kill(getpid(), SIGUSR1)); + + sigactive = 0; +} + +int +main(int argc, char **argv) +{ + struct sigaction act; + + act.sa_sigaction = act_handler; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_SIGINFO; + ASSERT(sigaction(SIGUSR1, &act, NULL) == 0); + + /* see if the signal handler recurses */ + CHECKe(kill(getpid(), SIGUSR1)); + sleep(1); + ASSERT(was_active == 0); + + /* allow recursive handlers, see that it is handled right */ + act.sa_flags |= SA_NODEFER; + ASSERT(sigaction(SIGUSR1, &act, NULL) == 0); + + /* see if the signal handler recurses */ + CHECKe(kill(getpid(), SIGUSR1)); + sleep(1); + ASSERT(was_active == 1); + + SUCCEED; +} -- cgit v1.2.3