Commit 4463e230 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by facebook-github-bot-9

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
parent 77a85008
......@@ -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);
......
......@@ -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 \
......
/*
* 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"));
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment