X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FThreadName.h;h=ba7bde25953925e451fdc447af422643365edacd;hb=f2ddd0ef782086145006f3c623ab4d3740e5ced8;hp=52b0cdaca63d625ad41aa94c94ff9a251e4c9baf;hpb=b85ce0974dd9de2781d142a3fa4fdadc8ec84150;p=folly.git diff --git a/folly/ThreadName.h b/folly/ThreadName.h index 52b0cdac..ba7bde25 100644 --- a/folly/ThreadName.h +++ b/folly/ThreadName.h @@ -16,97 +16,51 @@ #pragma once +#include #include -#include +#include #include -#include #include #include namespace folly { -// This looks a bit weird, but it's necessary to avoid -// having an undefined compiler function called. -#if defined(__GLIBC__) && !defined(__APPLE__) && !defined(__ANDROID__) -#if __GLIBC_PREREQ(2, 12) -// has pthread_setname_np(pthread_t, const char*) (2 params) -#define FOLLY_HAS_PTHREAD_SETNAME_NP_THREAD_NAME 1 -#endif -#endif +/** + * This returns true if the current platform supports setting the name of the + * current thread. + */ +bool canSetCurrentThreadName(); -#if defined(__APPLE__) && defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 -// has pthread_setname_np(const char*) (1 param) -#define FOLLY_HAS_PTHREAD_SETNAME_NP_NAME 1 -#endif -#endif +/** + * This returns true if the current platform supports setting the name of + * threads other than the one currently executing. + */ +bool canSetOtherThreadName(); -template -inline bool setThreadName(T /* id */, StringPiece /* name */) { - static_assert( -#if FOLLY_HAVE_PTHREAD - std::is_same::value || -#endif - std::is_same::value || - std::is_same::value, - "type must be pthread_t, std::thread::id or " - "std::thread::native_handle_type"); - return false; -} +/** + * Get the name of the given thread, or nothing if an error occurs + * or the functionality is not available. + */ +Optional getThreadName(std::thread::id tid); -template <> -inline bool setThreadName(std::thread::id tid, StringPiece name) { -#if !FOLLY_HAVE_PTHREAD - return false; -#else - static_assert( - std::is_same::value, - "This assumes that the native handle type is pthread_t"); - static_assert( - sizeof(std::thread::native_handle_type) == sizeof(std::thread::id), - "This assumes std::thread::id is a thin wrapper around " - "std::thread::native_handle_type, but that doesn't appear to be true."); - // In most implementations, std::thread::id is a thin wrapper around - // std::thread::native_handle_type, which means we can do unsafe things to - // extract it. - pthread_t id; - std::memcpy(&id, &tid, sizeof(id)); -#if FOLLY_HAS_PTHREAD_SETNAME_NP_THREAD_NAME - return 0 == pthread_setname_np(id, name.fbstr().substr(0, 15).c_str()); -#elif FOLLY_HAS_PTHREAD_SETNAME_NP_NAME - // Since OS X 10.6 it is possible for a thread to set its own name, - // but not that of some other thread. - if (pthread_equal(pthread_self(), id)) { - return 0 == pthread_setname_np(name.fbstr().c_str()); - } - return false; -#else - return false; -#endif -#endif -} +/** + * Equivalent to getThreadName(std::this_thread::get_id()); + */ +Optional getCurrentThreadName(); +/** + * Set the name of the given thread. + * Returns false on failure, if an error occurs or the functionality + * is not available. + */ +bool setThreadName(std::thread::id tid, StringPiece name); #if FOLLY_HAVE_PTHREAD -template <> -inline bool setThreadName(pthread_t pid, StringPiece name) { - static_assert( - std::is_same::value, - "This assumes that the native handle type is pthread_t"); - static_assert( - sizeof(std::thread::native_handle_type) == sizeof(std::thread::id), - "This assumes std::thread::id is a thin wrapper around " - "std::thread::native_handle_type, but that doesn't appear to be true."); - // In most implementations, std::thread::id is a thin wrapper around - // std::thread::native_handle_type, which means we can do unsafe things to - // extract it. - std::thread::id id; - std::memcpy(&id, &pid, sizeof(id)); - return setThreadName(id, name); -} +bool setThreadName(pthread_t pid, StringPiece name); #endif -inline bool setThreadName(StringPiece name) { - return setThreadName(std::this_thread::get_id(), name); -} +/** + * Equivalent to setThreadName(std::this_thread::get_id(), name); + */ +bool setThreadName(StringPiece name); }