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 Songvoid *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 Songint 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