<rdar://problem/11241798>
The less locks there are, the better. I removed the thread ID mutex and now just shared the m_thread_list's mutex to make sure we don't deadlock due to lock inversion.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@154652 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 4dba00b..77981ef 100644
--- a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -163,7 +163,6 @@
m_async_broadcaster (NULL, "lldb.process.gdb-remote.async-broadcaster"),
m_async_thread (LLDB_INVALID_HOST_THREAD),
m_thread_ids (),
- m_thread_ids_mutex (Mutex::eMutexTypeRecursive),
m_continue_c_tids (),
m_continue_C_tids (),
m_continue_s_tids (),
@@ -1157,14 +1156,14 @@
void
ProcessGDBRemote::ClearThreadIDList ()
{
- Mutex::Locker locker(m_thread_ids_mutex);
+ Mutex::Locker locker(m_thread_list.GetMutex());
m_thread_ids.clear();
}
bool
ProcessGDBRemote::UpdateThreadIDList ()
{
- Mutex::Locker locker(m_thread_ids_mutex);
+ Mutex::Locker locker(m_thread_list.GetMutex());
bool sequence_mutex_unavailable = false;
m_gdb_comm.GetCurrentThreadIDs (m_thread_ids, sequence_mutex_unavailable);
if (sequence_mutex_unavailable)
@@ -1184,8 +1183,6 @@
LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_THREAD));
if (log && log->GetMask().Test(GDBR_LOG_VERBOSE))
log->Printf ("ProcessGDBRemote::%s (pid = %llu)", __FUNCTION__, GetID());
- // Update the thread list's stop id immediately so we don't recurse into this function.
- Mutex::Locker locker(m_thread_ids_mutex);
size_t num_thread_ids = m_thread_ids.size();
// The "m_thread_ids" thread ID list should always be updated after each stop
@@ -1283,7 +1280,7 @@
}
else if (name.compare("threads") == 0)
{
- Mutex::Locker locker(m_thread_ids_mutex);
+ Mutex::Locker locker(m_thread_list.GetMutex());
m_thread_ids.clear();
// A comma separated list of all threads in the current
// process that includes the thread for this stop reply
@@ -1494,7 +1491,7 @@
void
ProcessGDBRemote::RefreshStateAfterStop ()
{
- Mutex::Locker locker(m_thread_ids_mutex);
+ Mutex::Locker locker(m_thread_list.GetMutex());
m_thread_ids.clear();
// Set the thread stop info. It might have a "threads" key whose value is
// a list of all thread IDs in the current process, so m_thread_ids might