1 /* $OpenBSD: sigdeliver.c,v 1.1 2002/10/12 03:39:21 marc Exp $ */
2 /* PUBLIC DOMAIN Oct 2002 <marc@snafu.org> */
3 
4 /*
5  * test signal delivery of pending signals
6  */
7 
8 #include <signal.h>
9 #include <stdio.h>
10 #include <unistd.h>
11 
12 #include "test.h"
13 
14 static pthread_mutex_t	sync_mutex;
15 
16 volatile sig_atomic_t	got_signal;
17 
18 /*
19  * sigusr1 signal handler.
20  */
21 static void
sighandler(int signo)22 sighandler(int signo)
23 {
24 	got_signal += 1;
25 }
26 
27 /*
28  * Install a signal handler for sigusr1 and then wait for it to
29  * occur.
30  */
31 static void *
do_nothing(void * arg)32 do_nothing (void *arg)
33 {
34 	SET_NAME("nothing");
35 
36 	ASSERT(signal(SIGUSR1, sighandler) != SIG_ERR);
37 	CHECKr(pthread_mutex_lock(&sync_mutex));
38 	ASSERT(got_signal != 0);
39 	CHECKr(pthread_mutex_unlock(&sync_mutex));
40 	return 0;
41 }
42 
43 int
main(int argc,char * argv[])44 main (int argc, char *argv[])
45 {
46 	pthread_t pthread;
47 
48 	/* Initialize and lock a mutex. */
49 	CHECKr(pthread_mutex_init(&sync_mutex, NULL));
50 	CHECKr(pthread_mutex_lock(&sync_mutex));
51 
52 	/* start a thread that will wait on the mutex we now own */
53 	CHECKr(pthread_create(&pthread, NULL, do_nothing, NULL));
54 
55 	/*
56 	 * Give the thread time to run and install its signal handler.
57 	 * The thread should be blocked waiting for the mutex we own.
58 	 * Give it a signal and then release the mutex and see if the
59 	 * signal is ever processed.
60 	 */
61 	sleep(2);
62 	CHECKr(pthread_kill(pthread, SIGUSR1));
63 	CHECKr(pthread_mutex_unlock(&sync_mutex));
64 	CHECKr(pthread_join(pthread, NULL));
65 	SUCCEED;
66 }
67