xref: /aosp_15_r20/external/compiler-rt/test/tsan/Darwin/libcxx-shared-ptr.mm (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot// RUN: %clangxx_tsan %s -o %t -framework Foundation
2*7c3d14c8STreehugger Robot// RUN: %env_tsan_opts=ignore_interceptors_accesses=1 %run %t 2>&1 | FileCheck %s
3*7c3d14c8STreehugger Robot
4*7c3d14c8STreehugger Robot#import <Foundation/Foundation.h>
5*7c3d14c8STreehugger Robot
6*7c3d14c8STreehugger Robot#import <memory>
7*7c3d14c8STreehugger Robot
8*7c3d14c8STreehugger Robot#import "../test.h"
9*7c3d14c8STreehugger Robot
10*7c3d14c8STreehugger Robotlong my_global;
11*7c3d14c8STreehugger Robot
12*7c3d14c8STreehugger Robotstruct MyStruct {
13*7c3d14c8STreehugger Robot  void setGlobal() {
14*7c3d14c8STreehugger Robot    my_global = 42;
15*7c3d14c8STreehugger Robot  }
16*7c3d14c8STreehugger Robot  ~MyStruct() {
17*7c3d14c8STreehugger Robot    my_global = 43;
18*7c3d14c8STreehugger Robot  }
19*7c3d14c8STreehugger Robot};
20*7c3d14c8STreehugger Robot
21*7c3d14c8STreehugger Robotint main(int argc, const char *argv[]) {
22*7c3d14c8STreehugger Robot  fprintf(stderr, "Hello world.\n");
23*7c3d14c8STreehugger Robot  print_address("addr=", 1, &my_global);
24*7c3d14c8STreehugger Robot  barrier_init(&barrier, 2);
25*7c3d14c8STreehugger Robot
26*7c3d14c8STreehugger Robot  std::shared_ptr<MyStruct> shared(new MyStruct());
27*7c3d14c8STreehugger Robot
28*7c3d14c8STreehugger Robot  dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
29*7c3d14c8STreehugger Robot
30*7c3d14c8STreehugger Robot  std::weak_ptr<MyStruct> weak(shared);
31*7c3d14c8STreehugger Robot
32*7c3d14c8STreehugger Robot  dispatch_async(q, ^{
33*7c3d14c8STreehugger Robot    {
34*7c3d14c8STreehugger Robot      std::shared_ptr<MyStruct> strong = weak.lock();
35*7c3d14c8STreehugger Robot      if (!strong) exit(1);
36*7c3d14c8STreehugger Robot
37*7c3d14c8STreehugger Robot      strong->setGlobal();
38*7c3d14c8STreehugger Robot    }
39*7c3d14c8STreehugger Robot    barrier_wait(&barrier);
40*7c3d14c8STreehugger Robot  });
41*7c3d14c8STreehugger Robot
42*7c3d14c8STreehugger Robot  barrier_wait(&barrier);
43*7c3d14c8STreehugger Robot  shared.reset();
44*7c3d14c8STreehugger Robot
45*7c3d14c8STreehugger Robot  fprintf(stderr, "Done.\n");
46*7c3d14c8STreehugger Robot}
47*7c3d14c8STreehugger Robot
48*7c3d14c8STreehugger Robot// CHECK: Hello world.
49*7c3d14c8STreehugger Robot// CHECK: Done.
50*7c3d14c8STreehugger Robot// CHECK-NOT: WARNING: ThreadSanitizer
51