]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/tsan/signal_pause.cc
Vendor import of compiler-rt trunk r351319 (just before the release_80
[FreeBSD/FreeBSD.git] / test / tsan / signal_pause.cc
1 // RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
2
3 // Test that pause loop handles signals.
4
5 #include "test.h"
6 #include <signal.h>
7 #include <errno.h>
8
9 void handler(int signum) {
10   write(2, "DONE\n", 5);
11   _exit(0);
12 }
13
14 void *thread(void *arg) {
15   for (;;)
16     pause();
17   return 0;
18 }
19
20 int main(int argc, char** argv) {
21   struct sigaction act = {};
22   act.sa_handler = &handler;
23   if (sigaction(SIGUSR1, &act, 0)) {
24     fprintf(stderr, "sigaction failed %d\n", errno);
25     return 1;
26   }
27   pthread_t th;
28   pthread_create(&th, 0, thread, 0);
29   sleep(1);  // give it time to block in pause
30   pthread_kill(th, SIGUSR1);
31   sleep(10);  // signal handler must exit the process while we are here
32   return 0;
33 }
34
35 // CHECK: DONE