tcc -MD: drop system includes and duplicates
[tinycc.git] / tests / tests2 / 114_bound_signal.c
blobbe76d812f2c558e93f9478f62ec6de199d243c8d
1 #include <stdio.h>
2 #include <pthread.h>
3 #include <semaphore.h>
4 #include <signal.h>
5 #include <string.h>
6 #include <sys/types.h>
7 #include <unistd.h>
8 #include <errno.h>
9 #include <setjmp.h>
11 static volatile int run = 1;
12 static int dummy[10];
13 static sem_t sem;
15 static void
16 add (void)
18 int i;
20 for (i = 0; i < (sizeof(dummy)/sizeof(dummy[0])); i++) {
21 dummy[i]++;
25 static void *
26 high_load (void *unused)
28 while (run) {
29 add();
31 return NULL;
34 static void *
35 do_signal (void *unused)
37 while (run) {
38 kill (getpid(), SIGUSR1);
39 while (sem_wait(&sem) < 0 && errno == EINTR);
41 return NULL;
44 /* See tcc-doc.info */
45 #ifdef __BOUNDS_CHECKING_ON
46 extern void __bound_checking (int no_check);
47 #define BOUNDS_CHECKING_OFF __bound_checking(1)
48 #define BOUNDS_CHECKING_ON __bound_checking(-1)
49 #else
50 #define BOUNDS_CHECKING_OFF
51 #define BOUNDS_CHECKING_ON
52 #endif
54 static void real_signal_handler(int sig)
56 add();
57 sem_post (&sem);
60 static void signal_handler(int sig)
62 BOUNDS_CHECKING_OFF;
63 real_signal_handler(sig);
64 BOUNDS_CHECKING_ON;
67 int
68 main (void)
70 int i;
71 pthread_t id1, id2;
72 struct sigaction act;
73 struct timespec request;
74 sigjmp_buf sj;
75 sigset_t m;
77 memset (&act, 0, sizeof (act));
78 act.sa_handler = signal_handler;
79 act.sa_flags = 0;
80 sigemptyset (&act.sa_mask);
81 sigaction (SIGUSR1, &act, NULL);
82 sem_init (&sem, 1, 0);
83 pthread_create(&id1, NULL, high_load, NULL);
84 pthread_create(&id2, NULL, do_signal, NULL);
85 clock_gettime (CLOCK_MONOTONIC, &request);
86 request.tv_sec += 1;
87 request.tv_nsec += 0;
88 printf ("start\n");
89 while (clock_nanosleep (CLOCK_MONOTONIC, TIMER_ABSTIME, &request, NULL)) {
91 printf ("end\n");
92 run = 0;
93 pthread_join(id1, NULL);
94 pthread_join(id2, NULL);
95 sem_destroy (&sem);
97 sigemptyset (&m);
98 sigprocmask (SIG_SETMASK, &m, NULL);
99 if (sigsetjmp (sj, 0) == 0)
101 sigaddset (&m, SIGUSR1);
102 sigprocmask (SIG_SETMASK, &m, NULL);
103 siglongjmp (sj, 1);
104 printf ("failed");
105 return 1;
107 sigprocmask (SIG_SETMASK, NULL, &m);
108 if (!sigismember (&m, SIGUSR1))
109 printf ("failed");
110 return 0;