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 Robotint 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