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