1// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
2#include "test.h"
3
4// Test that a linker-initialized mutex can be created/destroyed while in use.
5
6// Stub for testing, just invokes annotations.
7// Meant to be synchronized externally with test barrier.
8class Mutex {
9 public:
10 void Create(bool linker_initialized = false) {
11 if (linker_initialized)
12 ANNOTATE_RWLOCK_CREATE_STATIC(&state_);
13 else
14 ANNOTATE_RWLOCK_CREATE(&state_);
15 }
16
17 void Destroy() {
18 ANNOTATE_RWLOCK_DESTROY(&state_);
19 }
20
21 void Lock() {
22 ANNOTATE_RWLOCK_ACQUIRED(&state_, true);
23 }
24
25 void Unlock() {
26 ANNOTATE_RWLOCK_RELEASED(&state_, true);
27 }
28
29 private:
30 long long state_;
31};
32
33int main() {
34 Mutex m;
35
36 m.Lock();
37 m.Create(true);
38 m.Unlock();
39
40 m.Lock();
41 m.Destroy();
42 m.Unlock();
43
44 fprintf(stderr, "DONE\n");
45 return 0;
46}
47
48// CHECK-NOT: WARNING: ThreadSanitizer:
49// CHECK: DONE
50