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