xref: /llvm-project/compiler-rt/test/tsan/signal_exit.cpp (revision 20ee72d4ccb17c6f32641c690fa129475427ae45)
1*20ee72d4SDmitry Vyukov // RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
2*20ee72d4SDmitry Vyukov #include "test.h"
3*20ee72d4SDmitry Vyukov #include <signal.h>
4*20ee72d4SDmitry Vyukov #include <sys/types.h>
5*20ee72d4SDmitry Vyukov 
handler(int,siginfo_t *,void *)6*20ee72d4SDmitry Vyukov static void handler(int, siginfo_t *, void *) {
7*20ee72d4SDmitry Vyukov   write(2, "SIGNAL\n", 7);
8*20ee72d4SDmitry Vyukov   // CHECK: SIGNAL
9*20ee72d4SDmitry Vyukov   _exit(0);
10*20ee72d4SDmitry Vyukov   // CHECK-NOT: ThreadSanitizer: signal-unsafe call
11*20ee72d4SDmitry Vyukov }
12*20ee72d4SDmitry Vyukov 
main()13*20ee72d4SDmitry Vyukov int main() {
14*20ee72d4SDmitry Vyukov   struct sigaction act = {};
15*20ee72d4SDmitry Vyukov   act.sa_sigaction = &handler;
16*20ee72d4SDmitry Vyukov   act.sa_flags = SA_SIGINFO;
17*20ee72d4SDmitry Vyukov   sigaction(SIGPROF, &act, 0);
18*20ee72d4SDmitry Vyukov   raise(SIGPROF);
19*20ee72d4SDmitry Vyukov   fprintf(stderr, "DONE\n");
20*20ee72d4SDmitry Vyukov   // CHECK-NOT: DONE
21*20ee72d4SDmitry Vyukov   return 0;
22*20ee72d4SDmitry Vyukov }
23