xref: /openbsd-src/regress/lib/libpthread/signal/signal.c (revision 47911bd667ac77dc523b8a13ef40b012dbffa741)
1 /*	$OpenBSD: signal.c,v 1.4 2002/06/16 23:06:15 marc 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 	CHECKe(write(STDOUT_FILENO, "\n", 1));
28 	SUCCEED;
29 }
30 
31 void
32 handler(sig)
33 	int sig;
34 {
35 	int save_errno = errno;
36 
37 	alarmed = 1;
38 	alarm(1);
39 	signal(SIGALRM, handler);
40 	errno = save_errno;
41 }
42 
43 int
44 main()
45 {
46 	pthread_t slpr;
47 
48 	ASSERT(signal(SIGALRM, handler) != SIG_ERR);
49 	CHECKe(alarm(1));
50 	CHECKr(pthread_create(&slpr, NULL, sleeper, NULL));
51 	/* ASSERT(sleep(1) == 0); */
52 	for (;;) {
53 		if (alarmed) {
54 			alarmed = 0;
55 			CHECKe(write(STDOUT_FILENO, "!", 1));
56 		}
57 	}
58 }
59