brintos

brintos / llvm-project-archived public Read only

0
0
Text · 956 B · 057ff22 Raw
51 lines · plain
1// RUN: %clangxx_tsan %s -o %t -framework Foundation2// RUN: %run %t 2>&1 | FileCheck %s3 4#import <Foundation/Foundation.h>5 6#import <memory>7 8#import "../test.h"9 10long my_global;11 12struct MyStruct {13  void setGlobal() {14    my_global = 42;15  }16  ~MyStruct() {17    my_global = 43;18  }19};20 21int main(int argc, const char *argv[]) {22  fprintf(stderr, "Hello world.\n");23  print_address("addr=", 1, &my_global);24  barrier_init(&barrier, 2);25 26  std::shared_ptr<MyStruct> shared(new MyStruct());27 28  dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);29 30  std::weak_ptr<MyStruct> weak(shared);31  32  dispatch_async(q, ^{33    {34      std::shared_ptr<MyStruct> strong = weak.lock();35      if (!strong) exit(1);36 37      strong->setGlobal();38    }39    barrier_wait(&barrier);40  });41 42  barrier_wait(&barrier);43  shared.reset();44 45  fprintf(stderr, "Done.\n");46}47 48// CHECK: Hello world.49// CHECK: Done.50// CHECK-NOT: WARNING: ThreadSanitizer51