13056ccdbSDmitry Vyukov // RUN: %clangxx_tsan %s -o %t && %run %t 2>&1 | FileCheck %s 23056ccdbSDmitry Vyukov // UNSUPPORTED: darwin 33056ccdbSDmitry Vyukov 4*3a13c5a2SVitaly Buka // FIXME: Very flaky on PPC with COMPILER_RT_DEBUG. 5*3a13c5a2SVitaly Buka // https://github.com/google/sanitizers/issues/1792 616a2aa32SVitaly Buka // UNSUPPORTED: !compiler-rt-optimized && ppc 716a2aa32SVitaly Buka 83056ccdbSDmitry Vyukov // Test case for https://github.com/google/sanitizers/issues/1540 93056ccdbSDmitry Vyukov 103056ccdbSDmitry Vyukov #include <errno.h> 113056ccdbSDmitry Vyukov #include <pthread.h> 123056ccdbSDmitry Vyukov #include <signal.h> 133056ccdbSDmitry Vyukov #include <stdio.h> 143056ccdbSDmitry Vyukov #include <stdlib.h> 153056ccdbSDmitry Vyukov #include <sys/time.h> 163056ccdbSDmitry Vyukov #include <sys/types.h> 173056ccdbSDmitry Vyukov #include <unistd.h> 183056ccdbSDmitry Vyukov 193056ccdbSDmitry Vyukov volatile int X; 203056ccdbSDmitry Vyukov 213056ccdbSDmitry Vyukov static void handler(int sig) { 223056ccdbSDmitry Vyukov (void)sig; 233056ccdbSDmitry Vyukov if (X != 0) 243056ccdbSDmitry Vyukov printf("bad"); 253056ccdbSDmitry Vyukov } 263056ccdbSDmitry Vyukov 273056ccdbSDmitry Vyukov static void *thr1(void *p) { 283056ccdbSDmitry Vyukov sleep(1); 293056ccdbSDmitry Vyukov return 0; 303056ccdbSDmitry Vyukov } 313056ccdbSDmitry Vyukov 323056ccdbSDmitry Vyukov static void *thr(void *p) { 333056ccdbSDmitry Vyukov pthread_t th[10]; 343056ccdbSDmitry Vyukov for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++) 353056ccdbSDmitry Vyukov pthread_create(&th[i], 0, thr1, 0); 363056ccdbSDmitry Vyukov for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++) 373056ccdbSDmitry Vyukov pthread_join(th[i], 0); 383056ccdbSDmitry Vyukov return 0; 393056ccdbSDmitry Vyukov } 403056ccdbSDmitry Vyukov 413056ccdbSDmitry Vyukov int main() { 423056ccdbSDmitry Vyukov struct sigaction act = {}; 433056ccdbSDmitry Vyukov act.sa_handler = &handler; 444acd84e7SVitaly Buka if (sigaction(SIGPROF, &act, 0)) { 453056ccdbSDmitry Vyukov perror("sigaction"); 463056ccdbSDmitry Vyukov exit(1); 473056ccdbSDmitry Vyukov } 483056ccdbSDmitry Vyukov 493056ccdbSDmitry Vyukov itimerval t; 503056ccdbSDmitry Vyukov t.it_value.tv_sec = 0; 513056ccdbSDmitry Vyukov t.it_value.tv_usec = 10; 523056ccdbSDmitry Vyukov t.it_interval = t.it_value; 534acd84e7SVitaly Buka if (setitimer(ITIMER_PROF, &t, 0)) { 543056ccdbSDmitry Vyukov perror("setitimer"); 553056ccdbSDmitry Vyukov exit(1); 563056ccdbSDmitry Vyukov } 573056ccdbSDmitry Vyukov 583056ccdbSDmitry Vyukov pthread_t th[100]; 593056ccdbSDmitry Vyukov for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++) 603056ccdbSDmitry Vyukov pthread_create(&th[i], 0, thr, 0); 613056ccdbSDmitry Vyukov for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++) 623056ccdbSDmitry Vyukov pthread_join(th[i], 0); 633056ccdbSDmitry Vyukov 643056ccdbSDmitry Vyukov fprintf(stderr, "DONE\n"); 653056ccdbSDmitry Vyukov return 0; 663056ccdbSDmitry Vyukov } 673056ccdbSDmitry Vyukov 683056ccdbSDmitry Vyukov // CHECK-NOT: WARNING: ThreadSanitizer: 693056ccdbSDmitry Vyukov // CHECK: DONE 703056ccdbSDmitry Vyukov // CHECK-NOT: WARNING: ThreadSanitizer: 71