summaryrefslogtreecommitdiff
path: root/regress/lib/libpthread
diff options
context:
space:
mode:
authorMarco S Hyman <marc@cvs.openbsd.org>2002-10-21 18:46:36 +0000
committerMarco S Hyman <marc@cvs.openbsd.org>2002-10-21 18:46:36 +0000
commitae41d0613ce5e8e7a282f73df76374c910448ac1 (patch)
tree9c30bd8b0c22faef5095a7f53d7c27ed978ac54b /regress/lib/libpthread
parentdd46b9cbde1717e0c8e132dea11563c7e2cc2c10 (diff)
Add test for non-deferred signal handling in threads. pthreads code
that makes this test work is being tested.
Diffstat (limited to 'regress/lib/libpthread')
-rw-r--r--regress/lib/libpthread/signodefer/Makefile5
-rw-r--r--regress/lib/libpthread/signodefer/signodefer.c67
2 files changed, 72 insertions, 0 deletions
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 <bsd.regress.mk>
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 <marc@snafu.org> */
+
+/*
+ * test signal delivery of active signals (SA_NODEFER)
+ */
+
+#include <signal.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#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;
+}