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