From 4d1602cb0ab0023ac2ce4f8a00cf9f9db7828cd4 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 15 Jun 2010 09:49:22 +0200 Subject: [PATCH] Debugger[CDB]: Re-introduce signal-slot connection for output. ...to fix multithread crash. Fix exit crash by temporarily removing output. --- src/plugins/debugger/cdb/cdbdebugengine.cpp | 10 ++++++---- src/plugins/debugger/cdb/cdbdebugengine_p.h | 3 +-- src/plugins/debugger/cdb/cdbdebugoutput.cpp | 12 +++--------- src/plugins/debugger/cdb/cdbdebugoutput.h | 13 ++++++------- src/plugins/debugger/debuggermanager.cpp | 2 +- src/plugins/debugger/idebuggerengine.h | 1 + 6 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp index 95a58a2b02e..946ef23a5c8 100644 --- a/src/plugins/debugger/cdb/cdbdebugengine.cpp +++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp @@ -119,8 +119,7 @@ static QString msgFunctionFailed(const char *func, const QString &why) // --- CdbDebugEnginePrivate -CdbDebugEnginePrivate::CdbDebugEnginePrivate(DebuggerManager *manager, - const QSharedPointer &options, +CdbDebugEnginePrivate::CdbDebugEnginePrivate(const QSharedPointer &options, CdbDebugEngine *engine) : m_options(options), m_hDebuggeeProcess(0), @@ -149,7 +148,10 @@ bool CdbDebugEnginePrivate::init(QString *errorMessage) if (!CdbCore::CoreEngine::init(m_options->path, errorMessage)) return false; - CdbDebugOutput *output = new CdbDebugOutput(m_engine); + CdbDebugOutput *output = new CdbDebugOutput; + connect(output, SIGNAL(showMessage(QString,int,int)), + m_engine, SLOT(showMessage(QString,int,int)), + Qt::QueuedConnection); // Multithread invocation when loading dumpers. setDebugOutput(DebugOutputBasePtr(output)); setDebugEventCallback(DebugEventCallbackBasePtr(new CdbDebugEventCallback(m_engine))); updateCodeLevel(); @@ -212,7 +214,7 @@ void CdbDebugEnginePrivate::cleanStackTrace() CdbDebugEngine::CdbDebugEngine(DebuggerManager *manager, const QSharedPointer &options) : IDebuggerEngine(manager), - m_d(new CdbDebugEnginePrivate(manager, options, this)) + m_d(new CdbDebugEnginePrivate(options, this)) { m_d->m_consoleStubProc.setMode(Utils::ConsoleProcess::Suspend); connect(&m_d->m_consoleStubProc, SIGNAL(processMessage(QString,bool)), diff --git a/src/plugins/debugger/cdb/cdbdebugengine_p.h b/src/plugins/debugger/cdb/cdbdebugengine_p.h index b8e4fe0abf5..25d22d999dd 100644 --- a/src/plugins/debugger/cdb/cdbdebugengine_p.h +++ b/src/plugins/debugger/cdb/cdbdebugengine_p.h @@ -68,8 +68,7 @@ public: StoppedOther }; - explicit CdbDebugEnginePrivate(DebuggerManager *parent, - const QSharedPointer &options, + explicit CdbDebugEnginePrivate(const QSharedPointer &options, CdbDebugEngine* engine); ~CdbDebugEnginePrivate(); bool init(QString *errorMessage); diff --git a/src/plugins/debugger/cdb/cdbdebugoutput.cpp b/src/plugins/debugger/cdb/cdbdebugoutput.cpp index fb448b280b0..aba1d45e163 100644 --- a/src/plugins/debugger/cdb/cdbdebugoutput.cpp +++ b/src/plugins/debugger/cdb/cdbdebugoutput.cpp @@ -28,12 +28,9 @@ **************************************************************************/ #include "cdbdebugoutput.h" -#include "cdbdebugengine.h" +#include "debuggerrunner.h" #include "cdbdebugengine_p.h" #include "cdbcom.h" -#include "debuggerrunner.h" - -#include namespace Debugger { namespace Internal { @@ -61,18 +58,15 @@ static int logChannel(ULONG mask) return LogMisc; } -CdbDebugOutput::CdbDebugOutput(CdbDebugEngine *engine) - : m_engine(engine) +CdbDebugOutput::CdbDebugOutput() { } void CdbDebugOutput::output(ULONG mask, const QString &msg) { - DebuggerRunControl *runControl = m_engine->runControl(); - QTC_ASSERT(runControl, return); if (debugCDB > 1) qDebug() << Q_FUNC_INFO << "\n " << msg; - runControl->showMessage(msg, logChannel(mask)); + emit showMessage(msg, logChannel(mask), -1); } } // namespace Internal diff --git a/src/plugins/debugger/cdb/cdbdebugoutput.h b/src/plugins/debugger/cdb/cdbdebugoutput.h index 3f5f7e9a01e..c38512a15ea 100644 --- a/src/plugins/debugger/cdb/cdbdebugoutput.h +++ b/src/plugins/debugger/cdb/cdbdebugoutput.h @@ -37,19 +37,18 @@ namespace Debugger { namespace Internal { -class CdbDebugEngine; - // Standard CDB output handler -class CdbDebugOutput : public CdbCore::DebugOutputBase +class CdbDebugOutput : public QObject, public CdbCore::DebugOutputBase { + Q_OBJECT public: - explicit CdbDebugOutput(CdbDebugEngine *engine); + CdbDebugOutput(); + +signals: + void showMessage(const QString &output, int channel, int timeout); protected: virtual void output(ULONG mask, const QString &message); - -private: - CdbDebugEngine *m_engine; }; } // namespace Internal diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index a5f66a99854..8d2c9582236 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -874,7 +874,7 @@ void DebuggerManager::notifyInferiorPidChanged(qint64 pid) void DebuggerManager::aboutToShutdown() { - STATE_DEBUG(d->m_engine); + // TODO: STATE_DEBUG(d->m_engine); if (d->m_engine) d->m_engine->shutdown(); d->m_engine = 0; diff --git a/src/plugins/debugger/idebuggerengine.h b/src/plugins/debugger/idebuggerengine.h index 2ad5024c2c9..d38bf358c44 100644 --- a/src/plugins/debugger/idebuggerengine.h +++ b/src/plugins/debugger/idebuggerengine.h @@ -132,6 +132,7 @@ public: virtual bool isSynchroneous() const { return false; } virtual QString qtNamespace() const { return QString(); } +public slots: // Convenience void showMessage(const QString &msg, int channel = LogDebug, int timeout = -1) const; void showStatusMessage(const QString &msg, int timeout = -1) const