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