diff options
author | Greg Clayton <gclayton@apple.com> | 2016-07-11 22:50:18 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2016-07-11 22:50:18 +0000 |
commit | aacb80853a46bd544fa76a945667302be1de706c (patch) | |
tree | d4542fa34cb00f8c7bc65973555e2b556ffd43ef /clang/lib/CodeGen/CodeGenPGO.cpp | |
parent | 7ef5820fa3878e9428701155d7454c7943a033f4 (diff) | |
download | bcm5719-llvm-aacb80853a46bd544fa76a945667302be1de706c.tar.gz bcm5719-llvm-aacb80853a46bd544fa76a945667302be1de706c.zip |
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.
llvm-svn: 275119
Diffstat (limited to 'clang/lib/CodeGen/CodeGenPGO.cpp')
0 files changed, 0 insertions, 0 deletions