Set thread names on FreeBSD

Also move the logic to shorten thread names from linux/Host.cpp to a new
SetShortThreadName as both FreeBSD and Linux need the functionality.

llvm-svn: 187149
diff --git a/lldb/source/Host/common/Host.cpp b/lldb/source/Host/common/Host.cpp
index c2f6356..5aee4ad 100644
--- a/lldb/source/Host/common/Host.cpp
+++ b/lldb/source/Host/common/Host.cpp
@@ -648,6 +648,22 @@
             return true;
     }
     return false;
+#elif defined (__FreeBSD__)
+    lldb::pid_t curr_pid = Host::GetCurrentProcessID();
+    lldb::tid_t curr_tid = Host::GetCurrentThreadID();
+    if (pid == LLDB_INVALID_PROCESS_ID)
+        pid = curr_pid;
+
+    if (tid == LLDB_INVALID_THREAD_ID)
+        tid = curr_tid;
+
+    // Set the pthread name if possible
+    if (pid == curr_pid && tid == curr_tid)
+    {
+        ::pthread_set_name_np(::pthread_self(), name);
+        return true;
+    }
+    return false;
 #elif defined (__linux__) || defined (__GLIBC__)
     void *fn = dlsym (RTLD_DEFAULT, "pthread_setname_np");
     if (fn)
@@ -676,6 +692,37 @@
 #endif
 }
 
+bool
+Host::SetShortThreadName (lldb::pid_t pid, lldb::tid_t tid,
+                          const char *thread_name, size_t len)
+{
+    char *namebuf = (char *)::malloc (len + 1);
+
+    // Thread names are coming in like '<lldb.comm.debugger.edit>' and
+    // '<lldb.comm.debugger.editline>'.  So just chopping the end of the string
+    // off leads to a lot of similar named threads.  Go through the thread name
+    // and search for the last dot and use that.
+    const char *lastdot = ::strrchr (thread_name, '.');
+
+    if (lastdot && lastdot != thread_name)
+        thread_name = lastdot + 1;
+    ::strncpy (namebuf, thread_name, len);
+    namebuf[len] = 0;
+
+    int namebuflen = strlen(namebuf);
+    if (namebuflen > 0)
+    {
+        if (namebuf[namebuflen - 1] == '(' || namebuf[namebuflen - 1] == '>')
+        {
+            // Trim off trailing '(' and '>' characters for a bit more cleanup.
+            namebuflen--;
+            namebuf[namebuflen] = 0;
+        }
+        return Host::SetThreadName (pid, tid, namebuf);
+    }
+    return false;
+}
+
 FileSpec
 Host::GetProgramFileSpec ()
 {
diff --git a/lldb/source/Host/freebsd/Host.cpp b/lldb/source/Host/freebsd/Host.cpp
index a17be9f..405e7ea 100644
--- a/lldb/source/Host/freebsd/Host.cpp
+++ b/lldb/source/Host/freebsd/Host.cpp
@@ -75,6 +75,8 @@
     {
         ::pthread_setspecific (g_thread_create_key, new FreeBSDThread(thread_name));
     }
+
+    Host::SetShortThreadName (LLDB_INVALID_PROCESS_ID, LLDB_INVALID_THREAD_ID, thread_name, 16);
 }
 
 std::string
diff --git a/lldb/source/Host/linux/Host.cpp b/lldb/source/Host/linux/Host.cpp
index a756a47..cdcff1f 100644
--- a/lldb/source/Host/linux/Host.cpp
+++ b/lldb/source/Host/linux/Host.cpp
@@ -451,32 +451,7 @@
 {
     if (!Host::SetThreadName (LLDB_INVALID_PROCESS_ID, LLDB_INVALID_THREAD_ID, thread_name))
     {
-        // pthread_setname_np_func can fail if the thread name is longer than
-        //  the supported limit on Linux. When this occurs, the error ERANGE is returned
-        // and SetThreadName will fail. Let's drop it down to 16 characters and try again.
-        char namebuf[16];
-
-        // Thread names are coming in like '<lldb.comm.debugger.edit>' and '<lldb.comm.debugger.editline>'
-        // So just chopping the end of the string off leads to a lot of similar named threads.
-        // Go through the thread name and search for the last dot and use that.
-        const char *lastdot = ::strrchr( thread_name, '.' );
-
-        if (lastdot && lastdot != thread_name)
-            thread_name = lastdot + 1;
-        ::strncpy (namebuf, thread_name, sizeof(namebuf));
-        namebuf[ sizeof(namebuf) - 1 ] = 0;
-
-        int namebuflen = strlen(namebuf);
-        if (namebuflen > 0)
-        {
-            if (namebuf[namebuflen - 1] == '(' || namebuf[namebuflen - 1] == '>')
-            {
-                // Trim off trailing '(' and '>' characters for a bit more cleanup.
-                namebuflen--;
-                namebuf[namebuflen] = 0;
-            }
-            Host::SetThreadName (LLDB_INVALID_PROCESS_ID, LLDB_INVALID_THREAD_ID, namebuf);
-        }
+        Host::SetShortThreadName (LLDB_INVALID_PROCESS_ID, LLDB_INVALID_THREAD_ID, thread_name, 16);
     }
 }