1bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 --std=c++11 %s -o %t && %run %t 2>&1 | FileCheck %s 2bcaeed49SFangrui Song #include "custom_mutex.h" 3bcaeed49SFangrui Song 4*a1e7e401SKazuaki Ishizaki // Test that custom annotations provide normal mutex synchronization 5bcaeed49SFangrui Song // (no race reports for properly protected critical sections). 6bcaeed49SFangrui Song 7bcaeed49SFangrui Song Mutex mu(true, 0); 8bcaeed49SFangrui Song long data; 9bcaeed49SFangrui Song thr(void * arg)10bcaeed49SFangrui Songvoid *thr(void *arg) { 11bcaeed49SFangrui Song barrier_wait(&barrier); 12bcaeed49SFangrui Song mu.Lock(); 13bcaeed49SFangrui Song data++; 14bcaeed49SFangrui Song mu.Unlock(); 15bcaeed49SFangrui Song return 0; 16bcaeed49SFangrui Song } 17bcaeed49SFangrui Song main()18bcaeed49SFangrui Songint main() { 19bcaeed49SFangrui Song barrier_init(&barrier, 2); 20bcaeed49SFangrui Song pthread_t th; 21bcaeed49SFangrui Song pthread_create(&th, 0, thr, 0); 22bcaeed49SFangrui Song barrier_wait(&barrier); 23bcaeed49SFangrui Song mu.Lock(); 24bcaeed49SFangrui Song data++; 25bcaeed49SFangrui Song mu.Unlock(); 26bcaeed49SFangrui Song pthread_join(th, 0); 27bcaeed49SFangrui Song fprintf(stderr, "DONE\n"); 28bcaeed49SFangrui Song return 0; 29bcaeed49SFangrui Song } 30bcaeed49SFangrui Song 31bcaeed49SFangrui Song // CHECK: DONE 32