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