xref: /openbsd-src/regress/lib/libpthread/signal/signal.c (revision 3a3fbb3f2e2521ab7c4a56b7ff7462ebd9095ec5)
1 /*	$OpenBSD: signal.c,v 1.3 2001/11/11 23:26:35 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 void *
18 sleeper(arg)
19 	void *arg;
20 {
21 	sigset_t mask;
22 
23 	/* Ignore all signals in this thread */
24 	sigfillset(&mask);
25 	CHECKe(sigprocmask(SIG_SETMASK, &mask, NULL));
26 	ASSERT(sleep(3) == 0);
27 	SUCCEED;
28 }
29 
30 void
31 handler(sig)
32 	int sig;
33 {
34 	int save_errno = errno;
35 
36 	alarmed = 1;
37 	alarm(1);
38 	signal(SIGALRM, handler);
39 	errno = save_errno;
40 }
41 
42 int
43 main()
44 {
45 	pthread_t slpr;
46 
47 	ASSERT(signal(SIGALRM, handler) != SIG_ERR);
48 	CHECKe(alarm(1));
49 	CHECKr(pthread_create(&slpr, NULL, sleeper, NULL));
50 	/* ASSERT(sleep(1) == 0); */
51 	for (;;) {
52 		if (alarmed) {
53 			alarmed = 0;
54 			CHECKe(write(STDOUT_FILENO, "!", 1));
55 		}
56 	}
57 }
58