From 9b4e6512e011571a74eac73a1660e1b9583f0f3f Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 27 Oct 2009 12:05:03 +0100 Subject: [PATCH] protect against recursing into handleResponse those pesky nested event loops ... i pondered various other scenarios (in particular, the adapter or gdb crashing while the nested loop is running), but did not discover serious side effects of it, so i'm not trying to handle it specially. --- src/plugins/debugger/gdb/gdbengine.cpp | 9 +++++++++ src/plugins/debugger/gdb/gdbengine.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 143296be29..5639b7b4b6 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -191,6 +191,9 @@ GdbEngine::GdbEngine(DebuggerManager *manager) : m_trkOptions->fromSettings(Core::ICore::instance()->settings()); m_gdbAdapter = 0; + // Needs no resetting in initializeVariables() + m_busy = false; + connect(theDebuggerAction(AutoDerefPointers), SIGNAL(valueChanged(QVariant)), this, SLOT(setAutoDerefPointers(QVariant))); } @@ -594,6 +597,10 @@ void GdbEngine::readGdbStandardOutput() m_inbuffer.append(m_gdbProc.readAllStandardOutput()); + // This can trigger when a dialog starts a nested event loop + if (m_busy) + return; + while (newstart < m_inbuffer.size()) { int start = newstart; int end = m_inbuffer.indexOf('\n', scan); @@ -612,7 +619,9 @@ void GdbEngine::readGdbStandardOutput() continue; } #endif + m_busy = true; handleResponse(QByteArray::fromRawData(m_inbuffer.constData() + start, end - start)); + m_busy = false; } m_inbuffer.clear(); } diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 9e23fee2b2..57683529fe 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -160,6 +160,7 @@ private: QTextCodec::ConverterState m_outputCodecState; QByteArray m_inbuffer; + bool m_busy; QProcess m_gdbProc; AbstractGdbAdapter *m_gdbAdapter; -- GitLab