From 7313f3d666370ca5c9900e332b3f8401c663f28b Mon Sep 17 00:00:00 2001
From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Date: Mon, 5 Oct 2009 14:59:39 +0200
Subject: [PATCH] don't instanciate all adaptors at once

---
 src/plugins/debugger/gdb/abstractgdbadapter.h |  1 +
 src/plugins/debugger/gdb/gdbengine.cpp        | 50 +++++--------------
 src/plugins/debugger/gdb/gdbengine.h          | 14 ++----
 src/plugins/debugger/gdb/trkgdbadapter.h      |  1 -
 4 files changed, 19 insertions(+), 47 deletions(-)

diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h
index 5d0f1736087..b107477b6c0 100644
--- a/src/plugins/debugger/gdb/abstractgdbadapter.h
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.h
@@ -51,6 +51,7 @@ public:
     AbstractGdbAdapter(GdbEngine *engine, QObject *parent = 0)
         : QObject(parent), m_engine(engine)
     {}
+    virtual ~AbstractGdbAdapter() { disconnect(); }
 
     virtual QByteArray readAllStandardError() = 0;
     virtual QByteArray readAllStandardOutput() = 0;
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 322284dedee..d8f249f5c0e 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -179,14 +179,9 @@ GdbEngine::GdbEngine(DebuggerManager *manager) :
     m_dumperInjectionLoad(false)
 #endif
 {
+    m_trkOptions = QSharedPointer<TrkOptions>(new TrkOptions);
+    m_trkOptions->fromSettings(Core::ICore::instance()->settings());
     m_gdbAdapter = 0;
-    QSharedPointer<TrkOptions> options(new TrkOptions);
-    options->fromSettings(Core::ICore::instance()->settings());
-    m_plainAdapter = new PlainGdbAdapter(this);
-    m_trkAdapter = new TrkGdbAdapter(this, options);
-    m_remoteAdapter = new RemoteGdbAdapter(this);
-    m_coreAdapter = new CoreGdbAdapter(this);
-    m_attachAdapter = new AttachGdbAdapter(this);
 
     // Output
     connect(&m_outputCollector, SIGNAL(byteDelivery(QByteArray)),
@@ -237,16 +232,7 @@ QMainWindow *GdbEngine::mainWindow() const
 GdbEngine::~GdbEngine()
 {
     // prevent sending error messages afterwards
-    if (m_gdbAdapter) {
-        m_gdbAdapter->disconnect(this);
-        //delete m_gdbAdapter;
-        m_gdbAdapter = 0;
-    }
-    delete m_plainAdapter;
-    delete m_trkAdapter;
-    delete m_remoteAdapter;
-    delete m_coreAdapter;
-    delete m_attachAdapter;
+    delete m_gdbAdapter;
 }
 
 void GdbEngine::connectAdapter()
@@ -282,11 +268,6 @@ void GdbEngine::connectAdapter()
         this, SLOT(handleAdapterCrashed(QString)));
 }
 
-void GdbEngine::disconnectAdapter()
-{
-    disconnect(m_gdbAdapter, 0, this, 0);
-}
-
 void GdbEngine::initializeVariables()
 {
     m_debuggingHelperState = DebuggingHelperUninitialized;
@@ -1439,31 +1420,30 @@ int GdbEngine::currentFrame() const
     return manager()->stackHandler()->currentIndex();
 }
 
-AbstractGdbAdapter *GdbEngine::determineAdapter(const DebuggerStartParametersPtr &sp) const
+AbstractGdbAdapter *GdbEngine::createAdapter(const DebuggerStartParametersPtr &sp)
 {
     switch (sp->toolChainType) {
     case ProjectExplorer::ToolChain::WINSCW: // S60
     case ProjectExplorer::ToolChain::GCCE:
     case ProjectExplorer::ToolChain::RVCT_ARMV5:
     case ProjectExplorer::ToolChain::RVCT_ARMV6:
-        return m_trkAdapter;
+        return new TrkGdbAdapter(this, m_trkOptions);
     default:
         break;
     }
     // @todo: remove testing hack
     if (sp->processArgs.size() == 3 && sp->processArgs.at(0) == _("@sym@"))
-        return m_trkAdapter;
+        return new TrkGdbAdapter(this, m_trkOptions);
     switch (sp->startMode) {
     case AttachCore:
-        return m_coreAdapter;
+        return new CoreGdbAdapter(this);
     case StartRemote:
-        return m_remoteAdapter;
+        return new RemoteGdbAdapter(this);
     case AttachExternal:
-        return m_attachAdapter;
+        return new AttachGdbAdapter(this);
     default:
-        break;
+        return new PlainGdbAdapter(this);
     }
-    return m_plainAdapter;
 }
 
 void GdbEngine::startDebugger(const DebuggerStartParametersPtr &sp)
@@ -1477,10 +1457,8 @@ void GdbEngine::startDebugger(const DebuggerStartParametersPtr &sp)
 
     m_startParameters = sp;
 
-    if (m_gdbAdapter)
-        disconnectAdapter();
-
-    m_gdbAdapter = determineAdapter(sp);
+    delete m_gdbAdapter;
+    m_gdbAdapter = createAdapter(sp);
 
     if (startModeAllowsDumpers())
         connectDebuggingHelperActions();
@@ -4226,9 +4204,7 @@ void GdbEngine::handleAdapterShutdownFailed(const QString &msg)
 void GdbEngine::addOptionPages(QList<Core::IOptionsPage*> *opts) const
 {
     opts->push_back(new GdbOptionsPage);
-#ifdef QTCREATOR_WITH_S60
-        opts->push_back(new TrkOptionsPage(m_trkAdapter->options()));
-#endif
+    opts->push_back(new TrkOptionsPage(m_trkOptions));
 }
 
 void GdbEngine::showMessageBox(int icon, const QString &title, const QString &text)
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 7e9a7a7529d..1b6992da053 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -70,6 +70,7 @@ class CoreGdbAdapter;
 class PlainGdbAdapter;
 class RemoteGdbAdapter;
 class TrkGdbAdapter;
+struct TrkOptions;
 
 enum DebuggingHelperState
 {
@@ -162,7 +163,6 @@ private:
     StackFrame parseStackFrame(const GdbMi &mi, int level);
 
     void connectAdapter();
-    void disconnectAdapter();
     void initializeVariables();
     QString fullName(const QString &fileName);
     // get one usable name out of these, try full names first
@@ -396,7 +396,7 @@ private:
     void setLocals(const QList<GdbMi> &locals);
     void connectDebuggingHelperActions();
     void disconnectDebuggingHelperActions();
-    AbstractGdbAdapter *determineAdapter(const DebuggerStartParametersPtr &dp) const;
+    AbstractGdbAdapter *createAdapter(const DebuggerStartParametersPtr &dp);
 
     bool startModeAllowsDumpers() const;
     QString parseDisassembler(const GdbMi &lines);
@@ -423,13 +423,9 @@ private:
     DebuggerStartParametersPtr m_startParameters;
     // make sure to re-initialize new members in initializeVariables();
 
-    // only one of those is active at a given time, available in m_gdbAdapter
-    AbstractGdbAdapter *m_gdbAdapter;  // pointer to one listed below
-    AttachGdbAdapter *m_attachAdapter; // owned
-    CoreGdbAdapter *m_coreAdapter;     // owned
-    PlainGdbAdapter *m_plainAdapter;   // owned
-    RemoteGdbAdapter *m_remoteAdapter; // owned
-    TrkGdbAdapter *m_trkAdapter;       // owned
+    QSharedPointer<TrkOptions> m_trkOptions;
+
+    AbstractGdbAdapter *m_gdbAdapter;
 
 public:
     QString errorMessage(QProcess::ProcessError error);
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index 09ca35e17de..bcde7c3e555 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -145,7 +145,6 @@ public:
     // Set a device (from the project) to override the settings.
     QString overrideTrkDevice() const;
     void setOverrideTrkDevice(const QString &);
-    const TrkOptionsPtr options() const { return m_options; }
 
 signals:
     void output(const QString &msg);
-- 
GitLab