folly: improve setThreadName for macOS
[folly.git] / folly / test / ThreadNameTest.cpp
1 /*
2  * Copyright 2016 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <thread>
18 #include <folly/Baton.h>
19 #include <folly/ThreadName.h>
20 #include <gtest/gtest.h>
21
22 using namespace std;
23 using namespace folly;
24
25 constexpr bool expectedSetOtherThreadNameResult =
26 #ifdef FOLLY_HAS_PTHREAD_SETNAME_NP_THREAD_NAME
27     true
28 #else
29     false // This system has no known way to set the name of another thread
30 #endif
31     ;
32
33 constexpr bool expectedSetSelfThreadNameResult =
34 #if defined(FOLLY_HAS_PTHREAD_SETNAME_NP_THREAD_NAME) || \
35     defined(FOLLY_HAS_PTHREAD_SETNAME_NP_NAME)
36     true
37 #else
38     false // This system has no known way to set its own thread name
39 #endif
40     ;
41
42 TEST(ThreadName, setThreadName_self) {
43   thread th([] {
44     EXPECT_EQ(expectedSetSelfThreadNameResult, setThreadName("rockin-thread"));
45   });
46   SCOPE_EXIT { th.join(); };
47 }
48
49 TEST(ThreadName, setThreadName_other_pthread) {
50   Baton<> handle_set;
51   Baton<> let_thread_end;
52   pthread_t handle;
53   thread th([&] {
54       handle = pthread_self();
55       handle_set.post();
56       let_thread_end.wait();
57   });
58   SCOPE_EXIT { th.join(); };
59   handle_set.wait();
60   SCOPE_EXIT { let_thread_end.post(); };
61   EXPECT_EQ(
62       expectedSetOtherThreadNameResult, setThreadName(handle, "rockin-thread"));
63 }
64
65 TEST(ThreadName, setThreadName_other_native) {
66   Baton<> let_thread_end;
67   thread th([&] {
68       let_thread_end.wait();
69   });
70   SCOPE_EXIT { th.join(); };
71   SCOPE_EXIT { let_thread_end.post(); };
72   EXPECT_EQ(
73       expectedSetOtherThreadNameResult,
74       setThreadName(th.native_handle(), "rockin-thread"));
75 }