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