1 // RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s 2 // UNSUPPORTED: darwin 3 #include "test.h" 4 #include <signal.h> 5 #include <sys/types.h> 6 #include <sys/time.h> 7 #include <errno.h> 8 9 volatile int X; 10 11 static void handler(int sig) { 12 (void)sig; 13 if (X != 42) 14 printf("bad"); 15 } 16 17 static void* thr(void *p) { 18 for (int i = 0; i != 1000; i++) 19 usleep(1000); // process signals 20 return 0; 21 } 22 23 int main() { 24 const int kThreads = 10; 25 pthread_t th[kThreads]; 26 for (int i = 0; i < kThreads; i++) 27 pthread_create(&th[i], 0, thr, 0); 28 29 X = 42; 30 31 struct sigaction act = {}; 32 act.sa_handler = &handler; 33 if (sigaction(SIGPROF, &act, 0)) { 34 perror("sigaction"); 35 exit(1); 36 } 37 38 itimerval t; 39 t.it_value.tv_sec = 0; 40 t.it_value.tv_usec = 10; 41 t.it_interval = t.it_value; 42 if (setitimer(ITIMER_PROF, &t, 0)) { 43 perror("setitimer"); 44 exit(1); 45 } 46 47 for (int i = 0; i < kThreads; i++) 48 pthread_join(th[i], 0); 49 50 fprintf(stderr, "DONE\n"); 51 return 0; 52 } 53 54 // CHECK-NOT: WARNING: ThreadSanitizer: 55 // CHECK: DONE 56 // CHECK-NOT: WARNING: ThreadSanitizer: 57