summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2015-01-10 00:42:12 +0000
committerGreg Clayton <gclayton@apple.com>2015-01-10 00:42:12 +0000
commit62d5bc9ce41f30d57088bd095e2277104647c61b (patch)
treea85d38698aa0ca2fb0a10ed75ea840684fe5e71b
parent5b4a5de72a907b40b7d22d5d0a36617ec134f9a1 (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.cpp29
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,