brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.3 KiB · 08735b3 Raw
58 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 8const size_t size = 2;9long global;10long array[size];11 12void callback(void *context, size_t i) {13  long n = global;14  array[i] = n + i;15  barrier_wait(&barrier);16}17 18int main(int argc, const char *argv[]) {19  fprintf(stderr, "start\n");20 21  // Warm up GCD (workaround for macOS Sierra where dispatch_apply might run single-threaded).22  dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ });23 24  dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_CONCURRENT);25 26  global = 42;27 28  barrier_init(&barrier, size);29  dispatch_apply(size, q, ^(size_t i) {30    long n = global;31    array[i] = n + i;32    barrier_wait(&barrier);33  });34 35  for (size_t i = 0; i < size; i++) {36    fprintf(stderr, "array[%ld] = %ld\n", i, array[i]);37  }38 39  global = 142;40 41  barrier_init(&barrier, size);42  dispatch_apply_f(size, q, NULL, &callback);43 44  for (size_t i = 0; i < size; i++) {45    fprintf(stderr, "array[%ld] = %ld\n", i, array[i]);46  }47 48  fprintf(stderr, "done\n");49  return 0;50}51 52// CHECK: start53// CHECK: array[0] = 4254// CHECK: array[1] = 4355// CHECK: array[0] = 14256// CHECK: array[1] = 14357// CHECK: done58