Fixed CTRL+C related issues:
- CTRL+C wasn't clearing the command in lldb - CTRL+C doesn't work in python macros in lldb - Ctrl+C no longer interrupts the running process that you attach to <rdar://problem/15949205> <rdar://problem/16778652> <rdar://problem/16774411> llvm-svn: 207816
This commit is contained in:
@@ -93,6 +93,13 @@ ScriptInterpreterPython::Locker::DoAcquireLock()
|
||||
m_GILState = PyGILState_Ensure();
|
||||
if (log)
|
||||
log->Printf("Ensured PyGILState. Previous state = %slocked\n", m_GILState == PyGILState_UNLOCKED ? "un" : "");
|
||||
|
||||
// we need to save the thread state when we first start the command
|
||||
// because we might decide to interrupt it while some action is taking
|
||||
// place outside of Python (e.g. printing to screen, waiting for the network, ...)
|
||||
// in that case, _PyThreadState_Current will be NULL - and we would be unable
|
||||
// to set the asynchronous exception - not a desirable situation
|
||||
m_python_interpreter->SetThreadState (_PyThreadState_Current);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -781,10 +788,27 @@ public:
|
||||
|
||||
}
|
||||
|
||||
virtual void
|
||||
virtual bool
|
||||
Interrupt ()
|
||||
{
|
||||
|
||||
Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SCRIPT));
|
||||
|
||||
PyThreadState* state = _PyThreadState_Current;
|
||||
if (!state)
|
||||
state = m_python->GetThreadState();
|
||||
if (state)
|
||||
{
|
||||
long tid = state->thread_id;
|
||||
_PyThreadState_Current = state;
|
||||
int num_threads = PyThreadState_SetAsyncExc(tid, PyExc_KeyboardInterrupt);
|
||||
if (log)
|
||||
log->Printf("ScriptInterpreterPython::NonInteractiveInputReaderCallback, eInputReaderInterrupt, tid = %ld, num_threads = %d, state = %p",
|
||||
tid,num_threads,state);
|
||||
}
|
||||
else if (log)
|
||||
log->Printf("ScriptInterpreterPython::NonInteractiveInputReaderCallback, eInputReaderInterrupt, state = NULL");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual void
|
||||
@@ -2433,15 +2457,6 @@ ScriptInterpreterPython::RunScriptBasedCommand(const char* impl_function,
|
||||
SynchronicityHandler synch_handler(debugger_sp,
|
||||
synchronicity);
|
||||
|
||||
// we need to save the thread state when we first start the command
|
||||
// because we might decide to interrupt it while some action is taking
|
||||
// place outside of Python (e.g. printing to screen, waiting for the network, ...)
|
||||
// in that case, _PyThreadState_Current will be NULL - and we would be unable
|
||||
// to set the asynchronous exception - not a desirable situation
|
||||
m_command_thread_state = _PyThreadState_Current;
|
||||
|
||||
//PythonInputReaderManager py_input(this);
|
||||
|
||||
ret_val = g_swig_call_command (impl_function,
|
||||
m_dictionary_name.c_str(),
|
||||
debugger_sp,
|
||||
|
||||
Reference in New Issue
Block a user