xref: /openbsd/regress/lib/libpthread/signal/signal.c (revision 4bdff4be)
1 /*	$OpenBSD: signal.c,v 1.5 2003/07/31 21:48:06 deraadt Exp $	*/
2 /* David Leonard <d@openbsd.org>, 2001. Public Domain. */
3 
4 /*
5  * This program tests signal handler re-entrancy.
6  */
7 
8 #include <pthread.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <signal.h>
13 #include "test.h"
14 
15 volatile int alarmed;
16 
17 static void *
18 sleeper(void *arg)
19 {
20 	sigset_t mask;
21 
22 	/* Ignore all signals in this thread */
23 	sigfillset(&mask);
24 	CHECKe(sigprocmask(SIG_SETMASK, &mask, NULL));
25 	ASSERT(sleep(3) == 0);
26 	CHECKe(write(STDOUT_FILENO, "\n", 1));
27 	SUCCEED;
28 }
29 
30 static void
31 handler(int sig)
32 {
33 	int save_errno = errno;
34 
35 	alarmed = 1;
36 	alarm(1);
37 	signal(SIGALRM, handler);
38 	errno = save_errno;
39 }
40 
41 int
42 main(int argc, char *argv[])
43 {
44 	pthread_t slpr;
45 
46 	ASSERT(signal(SIGALRM, handler) != SIG_ERR);
47 	CHECKe(alarm(1));
48 	CHECKr(pthread_create(&slpr, NULL, sleeper, NULL));
49 	/* ASSERT(sleep(1) == 0); */
50 	for (;;) {
51 		if (alarmed) {
52 			alarmed = 0;
53 			CHECKe(write(STDOUT_FILENO, "!", 1));
54 		}
55 	}
56 }
57