1*d21b3d34SFangrui Song // RUN: %clangxx_msan -std=c++11 -O0 %s -o %t && %run %t
2*d21b3d34SFangrui Song // The main goal is getting the pthread name back and
3*d21b3d34SFangrui Song // FreeBSD based do not support this feature
4*d21b3d34SFangrui Song // UNSUPPORTED: android, freebsd
5*d21b3d34SFangrui Song
6*d21b3d34SFangrui Song // Regression test for a deadlock in pthread_getattr_np
7*d21b3d34SFangrui Song
8*d21b3d34SFangrui Song #include <assert.h>
9*d21b3d34SFangrui Song #include <pthread.h>
10*d21b3d34SFangrui Song #include <string.h>
11*d21b3d34SFangrui Song #include <sanitizer/msan_interface.h>
12*d21b3d34SFangrui Song
13*d21b3d34SFangrui Song #include <stdio.h>
14*d21b3d34SFangrui Song
15*d21b3d34SFangrui Song // Stall child thread on this lock to make sure it doesn't finish
16*d21b3d34SFangrui Song // before the end of the pthread_getname_np() / pthread_setname_np() tests.
17*d21b3d34SFangrui Song static pthread_mutex_t lock;
18*d21b3d34SFangrui Song
ThreadFn(void *)19*d21b3d34SFangrui Song void *ThreadFn(void *) {
20*d21b3d34SFangrui Song pthread_mutex_lock (&lock);
21*d21b3d34SFangrui Song pthread_mutex_unlock (&lock);
22*d21b3d34SFangrui Song return nullptr;
23*d21b3d34SFangrui Song }
24*d21b3d34SFangrui Song
main(void)25*d21b3d34SFangrui Song int main(void) {
26*d21b3d34SFangrui Song pthread_t t;
27*d21b3d34SFangrui Song
28*d21b3d34SFangrui Song pthread_mutex_init (&lock, NULL);
29*d21b3d34SFangrui Song pthread_mutex_lock (&lock);
30*d21b3d34SFangrui Song
31*d21b3d34SFangrui Song int res = pthread_create(&t, 0, ThreadFn, 0);
32*d21b3d34SFangrui Song assert(!res);
33*d21b3d34SFangrui Song
34*d21b3d34SFangrui Song const char *kMyThreadName = "my-thread-name";
35*d21b3d34SFangrui Song #if defined(__NetBSD__)
36*d21b3d34SFangrui Song res = pthread_setname_np(t, "%s", (void *)kMyThreadName);
37*d21b3d34SFangrui Song #else
38*d21b3d34SFangrui Song res = pthread_setname_np(t, kMyThreadName);
39*d21b3d34SFangrui Song #endif
40*d21b3d34SFangrui Song assert(!res);
41*d21b3d34SFangrui Song
42*d21b3d34SFangrui Song char buf[100];
43*d21b3d34SFangrui Song res = pthread_getname_np(t, buf, sizeof(buf));
44*d21b3d34SFangrui Song assert(!res);
45*d21b3d34SFangrui Song assert(strcmp(buf, kMyThreadName) == 0);
46*d21b3d34SFangrui Song
47*d21b3d34SFangrui Song pthread_mutex_unlock (&lock);
48*d21b3d34SFangrui Song
49*d21b3d34SFangrui Song res = pthread_join(t, 0);
50*d21b3d34SFangrui Song assert(!res);
51*d21b3d34SFangrui Song return 0;
52*d21b3d34SFangrui Song }
53