diff options
author | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-08 23:26:34 +0000 |
---|---|---|
committer | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-08 23:26:34 +0000 |
commit | fae91273c06d59b20e6654a455c342d8fb72f946 (patch) | |
tree | 0de7a578afd145a5d8d4fdb7a8c2eaaea043282c /base/platform_thread_mac.mm | |
parent | 5439283ff95a6f7d8b9e6d86c0fd178b0238acaa (diff) | |
download | chromium_src-fae91273c06d59b20e6654a455c342d8fb72f946.zip chromium_src-fae91273c06d59b20e6654a455c342d8fb72f946.tar.gz chromium_src-fae91273c06d59b20e6654a455c342d8fb72f946.tar.bz2 |
posix: set thread names
There's a non-portable function for doing this: pthread_setname_np.
It's supported by OS X >= 10.6 and the Xcode debugger will show the thread
names if they're provided. On Linux, support has just recently been added
to glibc for the same function. Since OS coverage of the function is so
spotty, we look for the symbol at runtime; on Linux we fall back to another
implementation of the same functionality if the function isn't available.
Review URL: http://codereview.chromium.org/2774001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49212 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/platform_thread_mac.mm')
-rw-r--r-- | base/platform_thread_mac.mm | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/base/platform_thread_mac.mm b/base/platform_thread_mac.mm index 46ac241..62139a9 100644 --- a/base/platform_thread_mac.mm +++ b/base/platform_thread_mac.mm @@ -5,8 +5,10 @@ #include "base/platform_thread.h" #import <Foundation/Foundation.h> +#include <dlfcn.h> #include "base/logging.h" +#include "base/safe_strerror_posix.h" // A simple class that demonstrates our impressive ability to do nothing. @interface NoOp : NSObject @@ -45,4 +47,23 @@ void InitThreading() { } } +// static +void PlatformThread::SetName(const char* name) { + // pthread_setname_np is only available in 10.6 or later, so test + // for it at runtime. + int (*dynamic_pthread_setname_np)(const char*); + *reinterpret_cast<void**>(&dynamic_pthread_setname_np) = + dlsym(RTLD_DEFAULT, "pthread_setname_np"); + if (!dynamic_pthread_setname_np) + return; + + // Mac OS X does not expose the length limit of the name, so + // hardcode it. + const int kMaxNameLength = 63; + std::string shortened_name = std::string(name).substr(0, kMaxNameLength); + int err = dynamic_pthread_setname_np(shortened_name.c_str()); + if (err < 0) + LOG(ERROR) << "pthread_setname_np: " << safe_strerror(err); +} + } // namespace base |