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
diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp
index bb23d98..305d6a9 100644
--- a/lldb/source/Interpreter/CommandInterpreter.cpp
+++ b/lldb/source/Interpreter/CommandInterpreter.cpp
@@ -2477,15 +2477,14 @@
}
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();
}