xref: /llvm-project/compiler-rt/test/msan/pthread_getattr_np_deadlock.cpp (revision d21b3d346af2f6189638d853182e389555e7ccb9)
1*d21b3d34SFangrui Song // RUN: %clangxx_msan -fsanitize-memory-track-origins -O0 %s -o %t && %run %t
2*d21b3d34SFangrui Song 
3*d21b3d34SFangrui Song // Regression test for a deadlock in pthread_getattr_np
4*d21b3d34SFangrui Song 
5*d21b3d34SFangrui Song #include <assert.h>
6*d21b3d34SFangrui Song #include <pthread.h>
7*d21b3d34SFangrui Song #if defined(__FreeBSD__)
8*d21b3d34SFangrui Song #include <pthread_np.h>
9*d21b3d34SFangrui Song #endif
10*d21b3d34SFangrui Song 
ThreadFn(void *)11*d21b3d34SFangrui Song void *ThreadFn(void *) {
12*d21b3d34SFangrui Song   pthread_attr_t attr;
13*d21b3d34SFangrui Song #if defined(__FreeBSD__)
14*d21b3d34SFangrui Song   // On FreeBSD it needs to allocate attr underlying memory
15*d21b3d34SFangrui Song   int res = pthread_attr_init(&attr);
16*d21b3d34SFangrui Song   assert(!res);
17*d21b3d34SFangrui Song   res = pthread_attr_get_np(pthread_self(), &attr);
18*d21b3d34SFangrui Song #else
19*d21b3d34SFangrui Song   int res = pthread_getattr_np(pthread_self(), &attr);
20*d21b3d34SFangrui Song #endif
21*d21b3d34SFangrui Song   assert(!res);
22*d21b3d34SFangrui Song   return 0;
23*d21b3d34SFangrui Song }
24*d21b3d34SFangrui Song 
main(void)25*d21b3d34SFangrui Song int main(void) {
26*d21b3d34SFangrui Song   pthread_t t;
27*d21b3d34SFangrui Song   int res = pthread_create(&t, 0, ThreadFn, 0);
28*d21b3d34SFangrui Song   assert(!res);
29*d21b3d34SFangrui Song   res = pthread_join(t, 0);
30*d21b3d34SFangrui Song   assert(!res);
31*d21b3d34SFangrui Song   return 0;
32*d21b3d34SFangrui Song }
33