brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 165055e Raw
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