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 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 * 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 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