Author: gclayton
Date: Mon Jul 11 17:50:18 2016
New Revision: 275119
URL: http://llvm.org/viewvc/llvm-project?rev=275119&view=rev
Log:
Fixed a threading race condition where we could crash after calling
Debugger::Terminate().
The issue was we have two global variables: one that contains a DebuggerList
pointer and one that contains a std::mutex pointer. These get initialized in
Debugger::Initialize(), and everywhere that uses these does:
if (g_debugger_list_ptr && g_debugger_list_mutex_ptr)
{
std::lock_guard<std::recursive_mutex> guard(*g_debugger_list_mutex_ptr);
// do work while mutex is locked
}
Debugger::Terminate() was deleting and nulling out g_debugger_list_ptr which
meant we had a race condition where someone might do the if statement and it
evaluates to true, then another thread calls Debugger::Terminate() and deletes
and nulls out g_debugger_list_ptr while holding the mutex, and another thread
then locks the mutex and tries to use g_debugger_list_ptr. The fix is to just
not delete and null out the g_debugger_list_ptr variable.
Modified:
lldb/trunk/source/Core/Debugger.cpp
Modified: lldb/trunk/source/Core/Debugger.cpp
URL:
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=275119&r1=275118&r2=275119&view=diff
==============================================================================
--- lldb/trunk/source/Core/Debugger.cpp (original)
+++ lldb/trunk/source/Core/Debugger.cpp Mon Jul 11 17:50:18 2016
@@ -462,8 +462,6 @@ Debugger::Terminate ()
for (const auto& debugger: *g_debugger_list_ptr)
debugger->Clear();
g_debugger_list_ptr->clear();
- delete g_debugger_list_ptr;
- g_debugger_list_ptr = nullptr;
}
}
}
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits