]>
Commit | Line | Data |
---|---|---|
92a42be0 | 1 | // RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s |
1a4d82fc JJ |
2 | |
3 | // Always enable asserts. | |
4 | #ifdef NDEBUG | |
5 | #undef NDEBUG | |
6 | #endif | |
7 | ||
8 | #include <assert.h> | |
9 | #include <stdlib.h> | |
10 | #include <signal.h> | |
11 | #include <unistd.h> | |
12 | #include <stdio.h> | |
13 | ||
14 | static bool signal_handler_ran = false; | |
15 | ||
16 | void do_nothing_signal_handler(int signum) { | |
17 | write(1, "HANDLER\n", 8); | |
18 | signal_handler_ran = true; | |
19 | } | |
20 | ||
21 | int main() { | |
22 | const int kSignalToTest = SIGSYS; | |
23 | assert(SIG_ERR != signal(kSignalToTest, do_nothing_signal_handler)); | |
24 | sigset_t empty_set; | |
25 | assert(0 == sigemptyset(&empty_set)); | |
26 | sigset_t one_signal = empty_set; | |
27 | assert(0 == sigaddset(&one_signal, kSignalToTest)); | |
28 | sigset_t old_set; | |
29 | assert(0 == sigprocmask(SIG_BLOCK, &one_signal, &old_set)); | |
30 | raise(kSignalToTest); | |
31 | assert(!signal_handler_ran); | |
32 | sigset_t all_but_one; | |
33 | assert(0 == sigfillset(&all_but_one)); | |
34 | assert(0 == sigdelset(&all_but_one, kSignalToTest)); | |
35 | sigsuspend(&all_but_one); | |
36 | assert(signal_handler_ran); | |
37 | ||
38 | // Restore the original set. | |
39 | assert(0 == sigprocmask(SIG_SETMASK, &old_set, NULL)); | |
92a42be0 | 40 | printf("DONE\n"); |
1a4d82fc JJ |
41 | } |
42 | ||
43 | // CHECK: HANDLER | |
44 | // CHECK: DONE |