diff options
author | Greg Clayton <gclayton@apple.com> | 2015-01-10 00:42:12 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2015-01-10 00:42:12 +0000 |
commit | 62d5bc9ce41f30d57088bd095e2277104647c61b (patch) | |
tree | a85d38698aa0ca2fb0a10ed75ea840684fe5e71b | |
parent | 5b4a5de72a907b40b7d22d5d0a36617ec134f9a1 (diff) |
Respect the fact that the result object claims it doesn't want to be interactive by not forwarding STDIN to the python invocation when it isn't desired.
This fixes an issue of running "script" commands via SBDebugger::HandleCommand(...) and SBCommandInterpreter::HandleCommand(...) deadlocking Xcode.
<rdar://problem/18075038>
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@225567 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | source/Interpreter/ScriptInterpreterPython.cpp | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/source/Interpreter/ScriptInterpreterPython.cpp b/source/Interpreter/ScriptInterpreterPython.cpp index cf7a30192..ab151073f 100644 --- a/source/Interpreter/ScriptInterpreterPython.cpp +++ b/source/Interpreter/ScriptInterpreterPython.cpp @@ -444,19 +444,23 @@ ScriptInterpreterPython::EnterSession (uint16_t on_entry_flags, if (in == nullptr || out == nullptr || err == nullptr) m_interpreter.GetDebugger().AdoptTopIOHandlerFilesIfInvalid (in_sp, out_sp, err_sp); - if (in == nullptr && in_sp && (on_entry_flags & Locker::NoSTDIN) == 0) - in = in_sp->GetFile().GetStream(); - if (in) - { - m_saved_stdin.Reset(sys_module_dict.GetItemForKey("stdin")); + m_saved_stdin.Reset(); - PyObject *new_file = PyFile_FromFile (in, (char *) "", (char *) "r", nullptr); - sys_module_dict.SetItemForKey ("stdin", new_file); - Py_DECREF (new_file); + if ((on_entry_flags & Locker::NoSTDIN) == 0) + { + // STDIN is enabled + if (in == nullptr && in_sp) + in = in_sp->GetFile().GetStream(); + if (in) + { + m_saved_stdin.Reset(sys_module_dict.GetItemForKey("stdin")); + // This call can deadlock your process if the file is locked + PyObject *new_file = PyFile_FromFile (in, (char *) "", (char *) "r", nullptr); + sys_module_dict.SetItemForKey ("stdin", new_file); + Py_DECREF (new_file); + } } - else - m_saved_stdin.Reset(); - + if (out == nullptr && out_sp) out = out_sp->GetFile().GetStream(); if (out) @@ -648,7 +652,8 @@ ScriptInterpreterPython::ExecuteOneLine (const char *command, CommandReturnObjec Locker locker(this, ScriptInterpreterPython::Locker::AcquireLock | ScriptInterpreterPython::Locker::InitSession | - (options.GetSetLLDBGlobals() ? ScriptInterpreterPython::Locker::InitGlobals : 0), + (options.GetSetLLDBGlobals() ? ScriptInterpreterPython::Locker::InitGlobals : 0) | + ((result && result->GetInteractive()) ? 0: Locker::NoSTDIN), ScriptInterpreterPython::Locker::FreeAcquiredLock | ScriptInterpreterPython::Locker::TearDownSession, in_file, |