50 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s2#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 else14 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: DONE50