brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1008 B · d473b34 Raw
55 lines · c
1// RUN: %clang_tsan %s -o %t2// RUN: %run %t 2>&1 | FileCheck %s --implicit-check-not='ThreadSanitizer'3 4#include <dispatch/dispatch.h>5 6#include "../test.h"7 8static const long kNumThreads = 4;9 10long global;11long global2;12 13static dispatch_once_t once_token;14static dispatch_once_t once_token2;15 16void f(void *a) {17  global2 = 42;18  usleep(100000);19}20 21void *Thread(void *a) {22  barrier_wait(&barrier);23 24  dispatch_once(&once_token, ^{25    global = 42;26    usleep(100000);27  });28  long x = global;29 30  dispatch_once_f(&once_token2, NULL, f);31  long x2 = global2;32 33  fprintf(stderr, "global = %ld\n", x);34  fprintf(stderr, "global2 = %ld\n", x2);35  return 0;36}37 38int main() {39  fprintf(stderr, "Hello world.\n");40  barrier_init(&barrier, kNumThreads);41 42  pthread_t t[kNumThreads];43  for (int i = 0; i < kNumThreads; i++) {44    pthread_create(&t[i], 0, Thread, 0);45  }46  for (int i = 0; i < kNumThreads; i++) {47    pthread_join(t[i], 0);48  }49 50  fprintf(stderr, "Done.\n");51}52 53// CHECK: Hello world.54// CHECK: Done.55