summaryrefslogtreecommitdiffstats
path: root/base/platform_thread_mac.mm
diff options
context:
space:
mode:
authorevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-10 22:55:17 +0000
committerevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-10 22:55:17 +0000
commit633d4a34b28c914102342ef7042f643fff3a4451 (patch)
tree5ee89f5e0fcb3bd9888db99f825afe4c0b402d55 /base/platform_thread_mac.mm
parentc844680f54d4b7e22656b947be29722ef9177d60 (diff)
downloadchromium_src-633d4a34b28c914102342ef7042f643fff3a4451.zip
chromium_src-633d4a34b28c914102342ef7042f643fff3a4451.tar.gz
chromium_src-633d4a34b28c914102342ef7042f643fff3a4451.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. [reland of r49212, with Mac fixed and Linux disabled; see comments in code as to why Linux is disabled] Review URL: http://codereview.chromium.org/2774001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49465 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/platform_thread_mac.mm')
-rw-r--r--base/platform_thread_mac.mm21
1 files changed, 21 insertions, 0 deletions
diff --git a/base/platform_thread_mac.mm b/base/platform_thread_mac.mm
index 46ac241..d155b323 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
@@ -46,3 +48,22 @@ void InitThreading() {
}
} // namespace base
+
+// 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);
+}