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