Fixing a potential crasher where Python would assume we have no thread state while clearing out an SBDebugger which was acquiring input from the interactive interpreter

llvm-svn: 154027
This commit is contained in:
Enrico Granata
2012-04-04 17:31:29 +00:00
parent 8d4a8010cf
commit 0249fba8c3

View File

@@ -381,15 +381,22 @@ ScriptInterpreterPython::RestoreTerminalState ()
void
ScriptInterpreterPython::LeaveSession ()
{
PyObject *sysmod = PyImport_AddModule ("sys");
PyObject *sysdict = PyModule_GetDict (sysmod);
if (m_new_sysout && sysmod && sysdict)
// checking that we have a valid thread state - since we use our own threading and locking
// in some (rare) cases during cleanup Python may end up believing we have no thread state
// and PyImport_AddModule will crash if that is the case - since that seems to only happen
// when destroying the SBDebugger, we can make do without clearing up stdout and stderr
if (PyThreadState_Get())
{
if (m_old_sysout)
PyDict_SetItemString (sysdict, "stdout", (PyObject*)m_old_sysout);
if (m_old_syserr)
PyDict_SetItemString (sysdict, "stderr", (PyObject*)m_old_syserr);
PyObject *sysmod = PyImport_AddModule ("sys");
PyObject *sysdict = PyModule_GetDict (sysmod);
if (m_new_sysout && sysmod && sysdict)
{
if (m_old_sysout)
PyDict_SetItemString (sysdict, "stdout", (PyObject*)m_old_sysout);
if (m_old_syserr)
PyDict_SetItemString (sysdict, "stderr", (PyObject*)m_old_syserr);
}
}
m_session_is_active = false;