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