summaryrefslogtreecommitdiffstats
path: root/lldb/source/Interpreter/CommandInterpreter.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2016-12-09 01:21:14 +0000
committerGreg Clayton <gclayton@apple.com>2016-12-09 01:21:14 +0000
commit7904046c33d8c8a24e1d78303bf0ebc61d7d9ef1 (patch)
tree9369d32b2747e41bfe1e2d9843cb028d9068e043 /lldb/source/Interpreter/CommandInterpreter.cpp
parent867e7d17655367377137393ea7d2fa68268d3001 (diff)
downloadbcm5719-llvm-7904046c33d8c8a24e1d78303bf0ebc61d7d9ef1.tar.gz
bcm5719-llvm-7904046c33d8c8a24e1d78303bf0ebc61d7d9ef1.zip
Calling SBDebugger::CeeateTarget being called on multiple threads was crashing LLDB.
I found the race condition in: ScriptInterpreter *CommandInterpreter::GetScriptInterpreter(bool can_create); More than one "ScriptInterpreter *" was being returned due to the race which caused any clients with the first one to now be pointing to freed memory and we would quickly crash. Added a test to catch this so we don't regress. <rdar://problem/28356584> llvm-svn: 289169
Diffstat (limited to 'lldb/source/Interpreter/CommandInterpreter.cpp')
-rw-r--r--lldb/source/Interpreter/CommandInterpreter.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp
index bb23d9884a8..305d6a9c763 100644
--- a/lldb/source/Interpreter/CommandInterpreter.cpp
+++ b/lldb/source/Interpreter/CommandInterpreter.cpp
@@ -2477,15 +2477,14 @@ void CommandInterpreter::HandleCommandsFromFile(
}
ScriptInterpreter *CommandInterpreter::GetScriptInterpreter(bool can_create) {
- if (m_script_interpreter_sp)
- return m_script_interpreter_sp.get();
-
- if (!can_create)
- return nullptr;
-
- lldb::ScriptLanguage script_lang = GetDebugger().GetScriptLanguage();
- m_script_interpreter_sp =
- PluginManager::GetScriptInterpreterForLanguage(script_lang, *this);
+ std::lock_guard<std::mutex> locker(m_script_interpreter_mutex);
+ if (!m_script_interpreter_sp) {
+ if (!can_create)
+ return nullptr;
+ lldb::ScriptLanguage script_lang = GetDebugger().GetScriptLanguage();
+ m_script_interpreter_sp =
+ PluginManager::GetScriptInterpreterForLanguage(script_lang, *this);
+ }
return m_script_interpreter_sp.get();
}
OpenPOWER on IntegriCloud