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