xref: /llvm-project/compiler-rt/test/tsan/Darwin/libcxx-call-once.mm (revision e4c1dd2c08586649ebb3ae1e51ad98f0efabaf68)
1419ebb28SKuba Brecka// RUN: %clangxx_tsan %s -o %t -framework Foundation -std=c++11
2*e4c1dd2cSKuba Mracek// RUN: %run %t 2>&1 | FileCheck %s
3419ebb28SKuba Brecka
4419ebb28SKuba Brecka#import <Foundation/Foundation.h>
5419ebb28SKuba Brecka
6419ebb28SKuba Brecka#import <iostream>
7419ebb28SKuba Brecka#import <thread>
8419ebb28SKuba Brecka
9419ebb28SKuba Breckalong my_global;
10419ebb28SKuba Breckastd::once_flag once_token;
11419ebb28SKuba Brecka
12419ebb28SKuba Breckavoid thread_func() {
13419ebb28SKuba Brecka  std::call_once(once_token, [] {
14419ebb28SKuba Brecka    my_global = 17;
15419ebb28SKuba Brecka  });
16419ebb28SKuba Brecka
17419ebb28SKuba Brecka  long val = my_global;
18419ebb28SKuba Brecka  fprintf(stderr, "my_global = %ld\n", val);
19419ebb28SKuba Brecka}
20419ebb28SKuba Brecka
21419ebb28SKuba Breckaint main(int argc, const char *argv[]) {
22419ebb28SKuba Brecka  fprintf(stderr, "Hello world.\n");
23419ebb28SKuba Brecka
24419ebb28SKuba Brecka  std::thread t1(thread_func);
25419ebb28SKuba Brecka  std::thread t2(thread_func);
26419ebb28SKuba Brecka  t1.join();
27419ebb28SKuba Brecka  t2.join();
28419ebb28SKuba Brecka
29419ebb28SKuba Brecka  fprintf(stderr, "Done.\n");
30419ebb28SKuba Brecka}
31419ebb28SKuba Brecka
32419ebb28SKuba Brecka// CHECK: Hello world.
33419ebb28SKuba Brecka// CHECK-NOT: WARNING: ThreadSanitizer
34419ebb28SKuba Brecka// CHECK: Done.
35