From 95e2c9ca5725e6c35f4e02d8c9ee24f4f0f4499a Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Mon, 26 Mar 2012 16:03:25 +0200
Subject: [PATCH] debugger: make the selection of detach or kill explicit

Change-Id: I6f80047ad229e0be851b06a277ab2f899757828f
Reviewed-by: hjk <qthjk@ovi.com>
---
 src/plugins/debugger/debuggerconstants.h         |  6 ++++++
 src/plugins/debugger/debuggerplugin.cpp          |  8 ++++++++
 src/plugins/debugger/debuggerstartparameters.h   |  2 ++
 src/plugins/debugger/gdb/abstractgdbadapter.h    |  1 -
 src/plugins/debugger/gdb/attachgdbadapter.cpp    |  5 -----
 src/plugins/debugger/gdb/attachgdbadapter.h      |  1 -
 src/plugins/debugger/gdb/codagdbadapter.cpp      |  5 -----
 src/plugins/debugger/gdb/codagdbadapter.h        |  1 -
 src/plugins/debugger/gdb/gdbengine.cpp           | 16 +++++++++-------
 src/plugins/debugger/gdb/gdbengine.h             |  1 -
 .../debugger/gdb/localplaingdbadapter.cpp        |  5 -----
 src/plugins/debugger/gdb/localplaingdbadapter.h  |  1 -
 .../debugger/gdb/remotegdbserveradapter.cpp      |  8 --------
 .../debugger/gdb/remotegdbserveradapter.h        |  1 -
 .../debugger/gdb/remoteplaingdbadapter.cpp       |  5 -----
 src/plugins/debugger/gdb/remoteplaingdbadapter.h |  1 -
 src/plugins/debugger/gdb/termgdbadapter.cpp      |  5 -----
 src/plugins/debugger/gdb/termgdbadapter.h        |  1 -
 18 files changed, 25 insertions(+), 48 deletions(-)

diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h
index 1367cbeb5bd..5925f2df179 100644
--- a/src/plugins/debugger/debuggerconstants.h
+++ b/src/plugins/debugger/debuggerconstants.h
@@ -134,6 +134,12 @@ enum DebuggerStartMode
     StartRemoteEngine      // Start ipc guest engine on other machine
 };
 
+enum DebuggerCloseMode
+{
+    KillAtClose,
+    DetachAtClose
+};
+
 enum DebuggerCapabilities
 {
     ReverseSteppingCapability = 0x1,
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 0eb329b346e..45e1e3e8243 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1339,6 +1339,7 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it,
         qulonglong pid = it->toULongLong();
         if (pid) {
             sp.startMode = AttachExternal;
+            sp.closeMode = DetachAtClose;
             sp.attachPID = pid;
             sp.displayName = tr("Process %1").arg(sp.attachPID);
             sp.startMessage = tr("Attaching to local process %1.").arg(sp.attachPID);
@@ -1560,6 +1561,7 @@ void DebuggerPluginPrivate::attachExternalApplication()
     sp.displayName = tr("Process %1").arg(dlg.attachPID());
     sp.executable = dlg.executable();
     sp.startMode = AttachExternal;
+    sp.closeMode = DetachAtClose;
     sp.toolChainAbi = dlg.abi();
     sp.debuggerCommand = dlg.debuggerCommand();
     if (DebuggerRunControl *rc = createDebugger(sp))
@@ -1572,6 +1574,7 @@ void DebuggerPluginPrivate::attachExternalApplication(RunControl *rc)
     sp.attachPID = rc->applicationProcessHandle().pid();
     sp.displayName = tr("Debugger attached to %1").arg(rc->displayName());
     sp.startMode = AttachExternal;
+    sp.closeMode = DetachAtClose;
     sp.toolChainAbi = rc->abi();
     if (DebuggerRunControl *rc = createDebugger(sp))
         startDebugger(rc);
@@ -1617,6 +1620,7 @@ void DebuggerPluginPrivate::attachToRemoteServer(const QString &spec)
     sp.remoteArchitecture = spec.section(QLatin1Char('@'), 2, 2);
     sp.displayName = tr("Remote: \"%1\"").arg(sp.remoteChannel);
     sp.startMode = AttachToRemoteServer;
+    sp.closeMode = KillAtClose;
     sp.toolChainAbi = anyAbiOfBinary(sp.executable);
     if (DebuggerRunControl *rc = createDebugger(sp))
         startDebugger(rc);
@@ -1630,6 +1634,7 @@ void DebuggerPluginPrivate::startRemoteCdbSession()
     sp.toolChainAbi = Abi(hostAbi.architecture(), Abi::WindowsOS,
         Abi::WindowsMsvc2010Flavor, Abi::PEFormat, hostAbi.wordWidth());
     sp.startMode = AttachToRemoteServer;
+    sp.closeMode = KillAtClose;
     StartRemoteCdbDialog dlg(mainWindow());
     QString previousConnection = configValue(connectionKey).toString();
     if (previousConnection.isEmpty())
@@ -1666,6 +1671,7 @@ void DebuggerPluginPrivate::attachToRemoteServer()
     DebuggerStartParameters sp;
     if (StartRemoteDialog::run(mainWindow(), m_coreSettings, false, &sp)) {
         sp.startMode = AttachToRemoteServer;
+        sp.closeMode = KillAtClose;
         sp.useServerStartScript = false;
         sp.serverStartScript.clear();
         if (RunControl *rc = createDebugger(sp))
@@ -1742,6 +1748,7 @@ void DebuggerPluginPrivate::attachedToProcess(const QString &channel,
     sp.sysroot = sysroot;
     sp.executable = localExecutable;
     sp.startMode = AttachToRemoteServer;
+    sp.closeMode = KillAtClose;
     sp.overrideStartScript.clear();
     sp.useServerStartScript = false;
     sp.serverStartScript.clear();
@@ -1785,6 +1792,7 @@ void DebuggerPluginPrivate::attachToQmlPort()
     sp.sysroot = dlg.sysroot();
 
     sp.startMode = AttachToRemoteServer;
+    sp.closeMode = KillAtClose;
     sp.languages = QmlLanguage;
 
     //
diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h
index b5eef3f2262..4adc77a8d07 100644
--- a/src/plugins/debugger/debuggerstartparameters.h
+++ b/src/plugins/debugger/debuggerstartparameters.h
@@ -67,6 +67,7 @@ public:
         useServerStartScript(false),
         requestRemoteSetup(false),
         startMode(NoStartMode),
+        closeMode(KillAtClose),
         executableUid(0),
         communicationChannel(CommunicationChannelTcpIp),
         serverPort(0),
@@ -125,6 +126,7 @@ public:
     QString dumperLibrary;
     QStringList dumperLibraryLocations;
     DebuggerStartMode startMode;
+    DebuggerCloseMode closeMode;
 
     // For Symbian debugging.
     quint32 executableUid;
diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h
index 05410a9d61e..51ed0bf5c59 100644
--- a/src/plugins/debugger/gdb/abstractgdbadapter.h
+++ b/src/plugins/debugger/gdb/abstractgdbadapter.h
@@ -75,7 +75,6 @@ public:
     virtual void setupInferior() = 0;
     virtual void runEngine() = 0;
     virtual void interruptInferior() = 0;
-    virtual void shutdownInferior() = 0;
     virtual void shutdownAdapter() = 0;
     virtual AbstractGdbProcess *gdbProc() = 0;
 
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp
index 6e1f91f1755..28c722a4e08 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp
@@ -116,11 +116,6 @@ void AttachGdbAdapter::interruptInferior()
     interruptLocalInferior(startParameters().attachPID);
 }
 
-void AttachGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("detach");
-}
-
 void AttachGdbAdapter::shutdownAdapter()
 {
     m_engine->notifyAdapterShutdownOk();
diff --git a/src/plugins/debugger/gdb/attachgdbadapter.h b/src/plugins/debugger/gdb/attachgdbadapter.h
index 01a6feb9fc7..e9a41ac49d9 100644
--- a/src/plugins/debugger/gdb/attachgdbadapter.h
+++ b/src/plugins/debugger/gdb/attachgdbadapter.h
@@ -59,7 +59,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
 
     AbstractGdbProcess *gdbProc() { return &m_gdbProc; }
diff --git a/src/plugins/debugger/gdb/codagdbadapter.cpp b/src/plugins/debugger/gdb/codagdbadapter.cpp
index 1cc5135f5eb..1049e4a2f5f 100644
--- a/src/plugins/debugger/gdb/codagdbadapter.cpp
+++ b/src/plugins/debugger/gdb/codagdbadapter.cpp
@@ -1237,11 +1237,6 @@ void CodaGdbAdapter::cleanup()
     }
 }
 
-void CodaGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("kill");
-}
-
 void CodaGdbAdapter::shutdownAdapter()
 {
     if (m_gdbProc.state() == QProcess::Running) {
diff --git a/src/plugins/debugger/gdb/codagdbadapter.h b/src/plugins/debugger/gdb/codagdbadapter.h
index d517cdedaf1..56efb451a85 100644
--- a/src/plugins/debugger/gdb/codagdbadapter.h
+++ b/src/plugins/debugger/gdb/codagdbadapter.h
@@ -114,7 +114,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
     void sendRunControlTerminateCommand();
     void handleRunControlTerminate(const Coda::CodaCommandResult &);
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 1bb0d94bec3..db8cb4bac1c 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -1893,13 +1893,15 @@ void GdbEngine::shutdownInferior()
 {
     QTC_ASSERT(state() == InferiorShutdownRequested, qDebug() << state());
     m_commandsToRunOnTemporaryBreak.clear();
-    m_gdbAdapter->shutdownInferior();
-}
-
-void GdbEngine::defaultInferiorShutdown(const char *cmd)
-{
-    QTC_ASSERT(state() == InferiorShutdownRequested, qDebug() << state());
-    postCommand(cmd, NeedsStop | LosesChild, CB(handleInferiorShutdown));
+    switch (startParameters().closeMode) {
+        case KillAtClose:
+            postCommand("kill", NeedsStop | LosesChild, CB(handleInferiorShutdown));
+            break;
+        case DetachAtClose:
+            postCommand("detach", NeedsStop | LosesChild, CB(handleInferiorShutdown));
+            break;
+    }
+    QTC_ASSERT(false, notifyInferiorShutdownFailed());
 }
 
 void GdbEngine::handleInferiorShutdown(const GdbResponse &response)
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 96c828e64a6..0403bcd12bd 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -264,7 +264,6 @@ private: ////////// Gdb Process Management //////////
     void handleNamespaceExtraction(const GdbResponse &response);
 
     void handleAdapterStarted();
-    void defaultInferiorShutdown(const char *cmd);
     void loadInitScript();
     void loadPythonDumpers();
     void pythonDumpersFailed();
diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.cpp b/src/plugins/debugger/gdb/localplaingdbadapter.cpp
index 0b0060ffa63..1e0ad9ff24d 100644
--- a/src/plugins/debugger/gdb/localplaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/localplaingdbadapter.cpp
@@ -114,11 +114,6 @@ void LocalPlainGdbAdapter::runEngine()
     AbstractPlainGdbAdapter::runEngine();
 }
 
-void LocalPlainGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("kill");
-}
-
 void LocalPlainGdbAdapter::shutdownAdapter()
 {
     showMessage(_("PLAIN ADAPTER SHUTDOWN %1").arg(state()));
diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.h b/src/plugins/debugger/gdb/localplaingdbadapter.h
index ced097faac3..39181bac7e6 100644
--- a/src/plugins/debugger/gdb/localplaingdbadapter.h
+++ b/src/plugins/debugger/gdb/localplaingdbadapter.h
@@ -58,7 +58,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
 
     DumperHandling dumperHandling() const;
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
index 0e3dd9e0ffa..daf20e3df0a 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp
@@ -365,14 +365,6 @@ void RemoteGdbServerAdapter::handleInterruptInferior(const GdbResponse &response
     }
 }
 
-void RemoteGdbServerAdapter::shutdownInferior()
-{
-    if (m_engine->startParameters().startMode == AttachToRemoteServer)
-        m_engine->defaultInferiorShutdown("detach");
-    else
-        m_engine->defaultInferiorShutdown("kill");
-}
-
 void RemoteGdbServerAdapter::shutdownAdapter()
 {
     m_engine->notifyAdapterShutdownOk();
diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.h b/src/plugins/debugger/gdb/remotegdbserveradapter.h
index 9261797d6d4..7a3f88d642e 100644
--- a/src/plugins/debugger/gdb/remotegdbserveradapter.h
+++ b/src/plugins/debugger/gdb/remotegdbserveradapter.h
@@ -59,7 +59,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
 
     AbstractGdbProcess *gdbProc() { return &m_gdbProc; }
diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp
index 5913ade0321..a3a7263b14a 100644
--- a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp
+++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp
@@ -98,11 +98,6 @@ void RemotePlainGdbAdapter::handleApplicationOutput(const QByteArray &output)
     showMessage(QString::fromUtf8(output), AppOutput);
 }
 
-void RemotePlainGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("kill");
-}
-
 void RemotePlainGdbAdapter::shutdownAdapter()
 {
     m_engine->notifyAdapterShutdownOk();
diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.h b/src/plugins/debugger/gdb/remoteplaingdbadapter.h
index b1e76445748..7c19e10df89 100644
--- a/src/plugins/debugger/gdb/remoteplaingdbadapter.h
+++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.h
@@ -55,7 +55,6 @@ private:
     void startAdapter();
     void setupInferior();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
     void handleRemoteSetupDone(int gdbServerPort, int qmlPort);
     void handleRemoteSetupFailed(const QString &reason);
diff --git a/src/plugins/debugger/gdb/termgdbadapter.cpp b/src/plugins/debugger/gdb/termgdbadapter.cpp
index 8acff6ede48..135630e8758 100644
--- a/src/plugins/debugger/gdb/termgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/termgdbadapter.cpp
@@ -210,11 +210,6 @@ void TermGdbAdapter::stubExited()
     m_engine->notifyEngineIll();
 }
 
-void TermGdbAdapter::shutdownInferior()
-{
-    m_engine->defaultInferiorShutdown("kill");
-}
-
 void TermGdbAdapter::shutdownAdapter()
 {
     m_engine->notifyAdapterShutdownOk();
diff --git a/src/plugins/debugger/gdb/termgdbadapter.h b/src/plugins/debugger/gdb/termgdbadapter.h
index d9ecee078d6..b56d969cd2d 100644
--- a/src/plugins/debugger/gdb/termgdbadapter.h
+++ b/src/plugins/debugger/gdb/termgdbadapter.h
@@ -62,7 +62,6 @@ private:
     void setupInferior();
     void runEngine();
     void interruptInferior();
-    void shutdownInferior();
     void shutdownAdapter();
 
     AbstractGdbProcess *gdbProc() { return &m_gdbProc; }
-- 
GitLab