71 lines · cpp
1// RUN: %clangxx_tsan %s -o %t && %run %t 2>&1 | FileCheck %s2// UNSUPPORTED: darwin3 4// FIXME: Very flaky on PPC with COMPILER_RT_DEBUG.5// https://github.com/google/sanitizers/issues/17926// UNSUPPORTED: !compiler-rt-optimized && ppc7 8// Test case for https://github.com/google/sanitizers/issues/15409 10#include <errno.h>11#include <pthread.h>12#include <signal.h>13#include <stdio.h>14#include <stdlib.h>15#include <sys/time.h>16#include <sys/types.h>17#include <unistd.h>18 19volatile int X;20 21static void handler(int sig) {22 (void)sig;23 if (X != 0)24 printf("bad");25}26 27static void *thr1(void *p) {28 sleep(1);29 return 0;30}31 32static void *thr(void *p) {33 pthread_t th[10];34 for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++)35 pthread_create(&th[i], 0, thr1, 0);36 for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++)37 pthread_join(th[i], 0);38 return 0;39}40 41int main() {42 struct sigaction act = {};43 act.sa_handler = &handler;44 if (sigaction(SIGPROF, &act, 0)) {45 perror("sigaction");46 exit(1);47 }48 49 itimerval t;50 t.it_value.tv_sec = 0;51 t.it_value.tv_usec = 10;52 t.it_interval = t.it_value;53 if (setitimer(ITIMER_PROF, &t, 0)) {54 perror("setitimer");55 exit(1);56 }57 58 pthread_t th[100];59 for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++)60 pthread_create(&th[i], 0, thr, 0);61 for (int i = 0; i < sizeof(th) / sizeof(th[0]); i++)62 pthread_join(th[i], 0);63 64 fprintf(stderr, "DONE\n");65 return 0;66}67 68// CHECK-NOT: WARNING: ThreadSanitizer:69// CHECK: DONE70// CHECK-NOT: WARNING: ThreadSanitizer:71