xref: /aosp_15_r20/external/compiler-rt/test/tsan/mutex_double_lock.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
2*7c3d14c8STreehugger Robot #include <pthread.h>
3*7c3d14c8STreehugger Robot #include <unistd.h>
4*7c3d14c8STreehugger Robot 
5*7c3d14c8STreehugger Robot extern "C" void AnnotateRWLockAcquired(const char *f, int l, void *m, long rw);
6*7c3d14c8STreehugger Robot 
ThreadFunc(void * m)7*7c3d14c8STreehugger Robot void *ThreadFunc(void *m) {
8*7c3d14c8STreehugger Robot   AnnotateRWLockAcquired(__FILE__, __LINE__, m, 1);
9*7c3d14c8STreehugger Robot   return 0;
10*7c3d14c8STreehugger Robot }
11*7c3d14c8STreehugger Robot 
main()12*7c3d14c8STreehugger Robot int main() {
13*7c3d14c8STreehugger Robot   int m = 0;
14*7c3d14c8STreehugger Robot   AnnotateRWLockAcquired(__FILE__, __LINE__, &m, 1);
15*7c3d14c8STreehugger Robot   pthread_t th;
16*7c3d14c8STreehugger Robot   pthread_create(&th, 0, ThreadFunc, &m);
17*7c3d14c8STreehugger Robot   pthread_join(th, 0);
18*7c3d14c8STreehugger Robot   return 0;
19*7c3d14c8STreehugger Robot }
20*7c3d14c8STreehugger Robot 
21*7c3d14c8STreehugger Robot // CHECK: WARNING: ThreadSanitizer: double lock of a mutex
22*7c3d14c8STreehugger Robot // CHECK:     #0 AnnotateRWLockAcquired
23*7c3d14c8STreehugger Robot // CHECK:     #1 ThreadFunc
24*7c3d14c8STreehugger Robot // CHECK: Location is stack of main thread.
25*7c3d14c8STreehugger Robot // CHECK:   Mutex {{.*}} created at:
26*7c3d14c8STreehugger Robot // CHECK:     #0 AnnotateRWLockAcquired
27*7c3d14c8STreehugger Robot // CHECK:     #1 main
28*7c3d14c8STreehugger Robot // CHECK: SUMMARY: ThreadSanitizer: double lock of a mutex {{.*}}mutex_double_lock.cc{{.*}}ThreadFunc
29*7c3d14c8STreehugger Robot 
30