1/* Compiler options: 2#notarget: cris*-*-elf 3#cc: additional_flags=-pthread 4#output: abbb ok\n 5 6 Testing a signal handler corner case. */ 7 8#include <stddef.h> 9#include <stdlib.h> 10#include <stdio.h> 11#include <unistd.h> 12#include <signal.h> 13#include <pthread.h> 14 15static void * 16process (void *arg) 17{ 18 write (2, "a", 1); 19 write (2, "b", 1); 20 write (2, "b", 1); 21 write (2, "b", 1); 22 return NULL; 23} 24 25int ok = 0; 26volatile int done = 0; 27 28void 29sigusr1 (int signum) 30{ 31 if (signum != SIGUSR1 || !ok) 32 abort (); 33 done = 1; 34} 35 36int 37main (void) 38{ 39 int retcode; 40 pthread_t th_a; 41 void *retval; 42 sigset_t sigs; 43 44 if (sigemptyset (&sigs) != 0) 45 abort (); 46 47 retcode = pthread_create (&th_a, NULL, process, NULL); 48 if (retcode != 0) 49 abort (); 50 51 if (signal (SIGUSR1, sigusr1) != SIG_DFL) 52 abort (); 53 if (pthread_sigmask (SIG_BLOCK, NULL, &sigs) != 0 54 || sigaddset (&sigs, SIGUSR1) != 0 55 || pthread_sigmask (SIG_BLOCK, &sigs, NULL) != 0) 56 abort (); 57 if (pthread_kill (pthread_self (), SIGUSR1) != 0 58 || sched_yield () != 0 59 || sched_yield () != 0 60 || sched_yield () != 0) 61 abort (); 62 63 ok = 1; 64 if (pthread_sigmask (SIG_UNBLOCK, NULL, &sigs) != 0 65 || sigaddset (&sigs, SIGUSR1) != 0 66 || pthread_sigmask (SIG_UNBLOCK, &sigs, NULL) != 0) 67 abort (); 68 69 if (!done) 70 abort (); 71 72 retcode = pthread_join (th_a, &retval); 73 if (retcode != 0) 74 abort (); 75 fprintf (stderr, " ok\n"); 76 return 0; 77} 78