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