Specialize and implement setThreadName only on some platforms
authorYedidya Feldblum <yfeldblum@fb.com>
Fri, 16 Oct 2015 01:55:27 +0000 (18:55 -0700)
committerfacebook-github-bot-9 <folly-bot@fb.com>
Fri, 16 Oct 2015 02:20:22 +0000 (19:20 -0700)
Summary: [Folly] Specialize and implement `setThreadName` only on some platforms.

With this technique, we can compile setThreadName and programs that call it on MSVC/Windows and on other platforms that don't have the underlying pthread call.

This is an alternative to: https://reviews.facebook.net/D46317.

Reviewed By: @nbronson

Differential Revision: D2535593

fb-gh-sync-id: 09d26f53e3fe69b49326b5b6492a7d59f86db2e8

folly/ThreadName.h
folly/test/Makefile.am
folly/test/ThreadNameTest.cpp [new file with mode: 0644]

index c7a3b15c65de95b8353c79f91499c6b764eeb32a..cd839594bf0f09d7c5fd45c2f09a23358358c377 100644 (file)
@@ -16,6 +16,7 @@
 
 #pragma once
 
+#include <thread>
 #include <pthread.h>
 #include <folly/Range.h>
 
@@ -29,13 +30,21 @@ namespace folly {
 #endif
 #endif
 
-inline bool setThreadName(pthread_t id, StringPiece name) {
+template <typename T>
+inline bool setThreadName(T id, StringPiece name) {
+  static_assert(
+      std::is_same<T, pthread_t>::value ||
+      std::is_same<T, std::thread::native_handle_type>::value,
+      "type must be pthread_t or std::thread::native_handle_type");
+  return false;
+}
+
 #ifdef FOLLY_HAS_PTHREAD_SETNAME_NP
+template <>
+inline bool setThreadName(pthread_t id, StringPiece name) {
   return 0 == pthread_setname_np(id, name.fbstr().substr(0, 15).c_str());
-#else
-  return false;
-#endif
 }
+#endif
 
 inline bool setThreadName(StringPiece name) {
   return setThreadName(pthread_self(), name);
index 81076c59536a34b8d8fb3dace6e9bbc11ed14df1..3b9913b9386e36ad990dd4ff28f0c5c0676950a0 100644 (file)
@@ -188,6 +188,10 @@ token_bucket_test_SOURCES = TokenBucketTest.cpp
 token_bucket_test_LDADD = libgtest.la $(top_builddir)/libfolly.la $(top_builddir)/libfollybenchmark.la
 TESTS += token_bucket_test
 
+thread_name_test_SOURCES = ThreadNameTest.cpp
+thread_name_test_LDADD = ligtest.la $(top_builddir)/libfolly.la
+TESTS += thread_name_test
+
 
 futures_test_SOURCES = \
     ../futures/test/CollectTest.cpp \
diff --git a/folly/test/ThreadNameTest.cpp b/folly/test/ThreadNameTest.cpp
new file mode 100644 (file)
index 0000000..8790953
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2015 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <thread>
+#include <folly/Baton.h>
+#include <folly/ThreadName.h>
+#include <gtest/gtest.h>
+
+using namespace std;
+using namespace folly;
+
+TEST(ThreadName, setThreadName_self) {
+  thread th([] {
+      EXPECT_TRUE(setThreadName("rockin-thread"));
+  });
+  SCOPE_EXIT { th.join(); };
+}
+
+TEST(ThreadName, setThreadName_other_pthread) {
+  Baton<> handle_set;
+  Baton<> let_thread_end;
+  pthread_t handle;
+  thread th([&] {
+      handle = pthread_self();
+      handle_set.post();
+      let_thread_end.wait();
+  });
+  SCOPE_EXIT { th.join(); };
+  handle_set.wait();
+  SCOPE_EXIT { let_thread_end.post(); };
+  EXPECT_TRUE(setThreadName(handle, "rockin-thread"));
+}
+
+TEST(ThreadName, setThreadName_other_native) {
+  Baton<> let_thread_end;
+  thread th([&] {
+      let_thread_end.wait();
+  });
+  SCOPE_EXIT { th.join(); };
+  SCOPE_EXIT { let_thread_end.post(); };
+  EXPECT_TRUE(setThreadName(th.native_handle(), "rockin-thread"));
+}