diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2013-07-16 11:28:04 +0000 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2013-07-16 11:28:04 +0000 |
| commit | 1a0c76fa55e46c7caf0f9af53299524963e52382 (patch) | |
| tree | 0c3bd00ec4077459fe8e87986f386b62b05c8109 /compiler-rt/lib/tsan/lit_tests | |
| parent | 82ec87dbdbe3961f4da50a50ab52476601ed0600 (diff) | |
| download | bcm5719-llvm-1a0c76fa55e46c7caf0f9af53299524963e52382.tar.gz bcm5719-llvm-1a0c76fa55e46c7caf0f9af53299524963e52382.zip | |
tsan: support sigsuspend() call
Intercepting it makes it process pending signal before return.
llvm-svn: 186400
Diffstat (limited to 'compiler-rt/lib/tsan/lit_tests')
| -rw-r--r-- | compiler-rt/lib/tsan/lit_tests/sigsuspend.cc | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/lit_tests/sigsuspend.cc b/compiler-rt/lib/tsan/lit_tests/sigsuspend.cc new file mode 100644 index 00000000000..4da20a6fa1f --- /dev/null +++ b/compiler-rt/lib/tsan/lit_tests/sigsuspend.cc @@ -0,0 +1,38 @@ +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s +#include <assert.h> +#include <stdlib.h> +#include <signal.h> +#include <unistd.h> +#include <stdio.h> + +static bool signal_handler_ran = false; + +void do_nothing_signal_handler(int signum) { + write(1, "HANDLER\n", 8); + signal_handler_ran = true; +} + +int main() { + const int kSignalToTest = SIGSYS; + assert(SIG_ERR != signal(kSignalToTest, do_nothing_signal_handler)); + sigset_t empty_set; + assert(0 == sigemptyset(&empty_set)); + sigset_t one_signal = empty_set; + assert(0 == sigaddset(&one_signal, kSignalToTest)); + sigset_t old_set; + assert(0 == sigprocmask(SIG_BLOCK, &one_signal, &old_set)); + raise(kSignalToTest); + assert(!signal_handler_ran); + sigset_t all_but_one; + assert(0 == sigfillset(&all_but_one)); + assert(0 == sigdelset(&all_but_one, kSignalToTest)); + sigsuspend(&all_but_one); + assert(signal_handler_ran); + + // Restore the original set. + assert(0 == sigprocmask(SIG_SETMASK, &old_set, NULL)); + printf("DONE"); +} + +// CHECK: HANDLER +// CHECK: DONE |

