forked from OSchip/llvm-project
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
This commit is contained in:
parent
72090eea73
commit
02983be252
|
@ -303,6 +303,27 @@ public:
|
|||
static bool
|
||||
SetThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name);
|
||||
|
||||
//------------------------------------------------------------------
|
||||
/// Sets a shortened name of a thread in the current process.
|
||||
///
|
||||
/// @param[in] pid
|
||||
/// The process ID in which we are trying to name a thread.
|
||||
///
|
||||
/// @param[in] tid
|
||||
/// The thread ID which we are trying to name.
|
||||
///
|
||||
/// @param[in] name
|
||||
/// The current thread's name in the current process to \a name.
|
||||
///
|
||||
/// @param[in] len
|
||||
/// The maximum length for the thread's shortened name.
|
||||
///
|
||||
/// @return
|
||||
/// \b true if the thread name was able to be set, \b false
|
||||
/// otherwise.
|
||||
static bool
|
||||
SetShortThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name, size_t len);
|
||||
|
||||
//------------------------------------------------------------------
|
||||
/// Gets the FileSpec of the current process (the process that
|
||||
/// that is running the LLDB code).
|
||||
|
|
|
@ -648,6 +648,22 @@ Host::SetThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name)
|
|||
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 @@ Host::SetThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name)
|
|||
#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 ()
|
||||
{
|
||||
|
|
|
@ -75,6 +75,8 @@ Host::ThreadCreated (const char *thread_name)
|
|||
{
|
||||
::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
|
||||
|
|
|
@ -451,32 +451,7 @@ Host::ThreadCreated (const char *thread_name)
|
|||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue