From 4463e2301ce61477bbe4c0982d699158db33637f Mon Sep 17 00:00:00 2001 From: Yedidya Feldblum Date: Thu, 15 Oct 2015 18:55:27 -0700 Subject: [PATCH] Specialize and implement setThreadName only on some platforms 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 | 17 ++++++++--- folly/test/Makefile.am | 4 +++ folly/test/ThreadNameTest.cpp | 55 +++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 folly/test/ThreadNameTest.cpp diff --git a/folly/ThreadName.h b/folly/ThreadName.h index c7a3b15c..cd839594 100644 --- a/folly/ThreadName.h +++ b/folly/ThreadName.h @@ -16,6 +16,7 @@ #pragma once +#include #include #include @@ -29,13 +30,21 @@ namespace folly { #endif #endif -inline bool setThreadName(pthread_t id, StringPiece name) { +template +inline bool setThreadName(T id, StringPiece name) { + static_assert( + std::is_same::value || + std::is_same::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); diff --git a/folly/test/Makefile.am b/folly/test/Makefile.am index 81076c59..3b9913b9 100644 --- a/folly/test/Makefile.am +++ b/folly/test/Makefile.am @@ -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 index 00000000..87909538 --- /dev/null +++ b/folly/test/ThreadNameTest.cpp @@ -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 +#include +#include +#include + +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")); +} -- 2.34.1