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 
15 static void *
process(void * arg)16 process (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 
25 int ok = 0;
26 volatile int done = 0;
27 
28 void
sigusr1(int signum)29 sigusr1 (int signum)
30 {
31   if (signum != SIGUSR1 || !ok)
32     abort ();
33   done = 1;
34 }
35 
36 int
main(void)37 main (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