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