From 7904046c33d8c8a24e1d78303bf0ebc61d7d9ef1 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Fri, 9 Dec 2016 01:21:14 +0000 Subject: 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. llvm-svn: 289169 --- lldb/source/Interpreter/CommandInterpreter.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'lldb/source/Interpreter/CommandInterpreter.cpp') 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 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(); } -- cgit v1.2.3