1*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 --std=c++11 %s -o %t
2*bcaeed49SFangrui Song // RUN: %env_tsan_opts=report_destroy_locked=0 %run %t 2>&1 | FileCheck %s
3*bcaeed49SFangrui Song #include "custom_mutex.h"
4*bcaeed49SFangrui Song 
5*bcaeed49SFangrui Song // Regression test for a bug.
6*bcaeed49SFangrui Song // Thr1 destroys a locked mutex, previously such mutex was not removed from
7*bcaeed49SFangrui Song // sync map and as the result subsequent uses of a mutex located at the same
8*bcaeed49SFangrui Song // address caused false race reports.
9*bcaeed49SFangrui Song 
10*bcaeed49SFangrui Song Mutex mu(false, __tsan_mutex_write_reentrant);
11*bcaeed49SFangrui Song long data;
12*bcaeed49SFangrui Song 
thr1(void * arg)13*bcaeed49SFangrui Song void *thr1(void *arg) {
14*bcaeed49SFangrui Song   mu.Lock();
15*bcaeed49SFangrui Song   mu.~Mutex();
16*bcaeed49SFangrui Song   new(&mu) Mutex(true, __tsan_mutex_write_reentrant);
17*bcaeed49SFangrui Song   return 0;
18*bcaeed49SFangrui Song }
19*bcaeed49SFangrui Song 
thr2(void * arg)20*bcaeed49SFangrui Song void *thr2(void *arg) {
21*bcaeed49SFangrui Song   barrier_wait(&barrier);
22*bcaeed49SFangrui Song   mu.Lock();
23*bcaeed49SFangrui Song   data++;
24*bcaeed49SFangrui Song   mu.Unlock();
25*bcaeed49SFangrui Song   return 0;
26*bcaeed49SFangrui Song }
27*bcaeed49SFangrui Song 
main()28*bcaeed49SFangrui Song int main() {
29*bcaeed49SFangrui Song   barrier_init(&barrier, 2);
30*bcaeed49SFangrui Song   pthread_t th;
31*bcaeed49SFangrui Song   pthread_create(&th, 0, thr1, 0);
32*bcaeed49SFangrui Song   pthread_join(th, 0);
33*bcaeed49SFangrui Song 
34*bcaeed49SFangrui Song   barrier_init(&barrier, 2);
35*bcaeed49SFangrui Song   pthread_create(&th, 0, thr2, 0);
36*bcaeed49SFangrui Song   mu.Lock();
37*bcaeed49SFangrui Song   data++;
38*bcaeed49SFangrui Song   mu.Unlock();
39*bcaeed49SFangrui Song   barrier_wait(&barrier);
40*bcaeed49SFangrui Song   pthread_join(th, 0);
41*bcaeed49SFangrui Song   fprintf(stderr, "DONE\n");
42*bcaeed49SFangrui Song   return 0;
43*bcaeed49SFangrui Song }
44*bcaeed49SFangrui Song 
45*bcaeed49SFangrui Song // CHECK-NOT: WARNING: ThreadSanitizer: data race
46*bcaeed49SFangrui Song // CHECK: DONE
47