|  | // RUN: %clangxx_tsan -O1 --std=c++11 %s -o %t && %deflake %run %t 2>&1 | FileCheck %s | 
|  | #include "custom_mutex.h" | 
|  |  | 
|  | // Test that failed TryLock does not induce parasitic synchronization. | 
|  |  | 
|  | Mutex mu(true, 0); | 
|  | long data; | 
|  |  | 
|  | void *thr(void *arg) { | 
|  | mu.Lock(); | 
|  | data++; | 
|  | mu.Unlock(); | 
|  | mu.Lock(); | 
|  | barrier_wait(&barrier); | 
|  | barrier_wait(&barrier); | 
|  | mu.Unlock(); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int main() { | 
|  | barrier_init(&barrier, 2); | 
|  | pthread_t th; | 
|  | pthread_create(&th, 0, thr, 0); | 
|  | barrier_wait(&barrier); | 
|  | if (mu.TryLock()) { | 
|  | fprintf(stderr, "TryLock succeeded, should not\n"); | 
|  | exit(0); | 
|  | } | 
|  | data++; | 
|  | barrier_wait(&barrier); | 
|  | pthread_join(th, 0); | 
|  | fprintf(stderr, "DONE\n"); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | // CHECK: ThreadSanitizer: data race | 
|  | // CHECK-NEXT:   Write of size 8 at {{.*}} by main thread: | 
|  | // CHECK-NEXT:     #0 main {{.*}}custom_mutex1.cpp:29 | 
|  | // CHECK: DONE |