From 753a28ed4e6c47c8e926f21c994edce55e2b6cf9 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Tue, 20 Jul 2010 18:31:35 +0200
Subject: [PATCH] debugger: make debugger restartable using the buttons in the
 application output pane

---
 src/plugins/debugger/debuggerengine.cpp | 24 ++++++++++++++++++------
 src/plugins/debugger/debuggerengine.h   |  1 +
 src/plugins/debugger/debuggerrunner.cpp |  1 +
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index fa740f1e590..213f6c81dc9 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -685,8 +685,6 @@ void DebuggerEngine::startDebugger(DebuggerRunControl *runControl)
 
     d->m_runControl = runControl;
 
-    QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state());
-
     d->m_inferiorPid = d->m_startParameters.attachPID > 0
         ? d->m_startParameters.attachPID : 0;
 
@@ -700,7 +698,10 @@ void DebuggerEngine::startDebugger(DebuggerRunControl *runControl)
     theDebuggerAction(OperateByInstruction)
         ->setEnabled(engineCapabilities & DisassemblerCapability);
 
+    QTC_ASSERT(state() == DebuggerNotReady || state() == DebuggerFinished,
+         qDebug() << state());
     setState(EngineSetupRequested);
+
     setupEngine();
 }
 
@@ -869,9 +870,16 @@ void DebuggerEngine::addToWatchWindow()
     watchHandler()->watchExpression(exp);
 }
 
+// Called from RunControl.
+void DebuggerEngine::handleStartFailed()
+{
+    d->m_runControl = 0;
+}
+
 // Called from RunControl.
 void DebuggerEngine::handleFinished()
 {
+    d->m_runControl = 0;
     modulesHandler()->removeAll();
     stackHandler()->removeAll();
     threadsHandler()->removeAll();
@@ -983,7 +991,7 @@ static bool isAllowedTransition(DebuggerState from, DebuggerState to)
     case EngineSetupRequested:
         return to == EngineSetupOk || to == EngineSetupFailed;
     case EngineSetupFailed:
-        // FIXME: In therory it's the engine's task to go into a 
+        // FIXME: In therory it's the engine's task to go into a
         // proper "Shutdown" state before calling notifyEngineSetupFailed
         //return to == DebuggerFinished;
         return to == EngineShutdownRequested;
@@ -1034,7 +1042,7 @@ static bool isAllowedTransition(DebuggerState from, DebuggerState to)
         return to == DebuggerFinished;
 
     case DebuggerFinished:
-        return false;
+        return to == EngineSetupRequested; // Happens on restart.
     }
 
     qDebug() << "UNKNOWN STATE:" << from;
@@ -1046,7 +1054,9 @@ void DebuggerEngine::notifyEngineSetupFailed()
     showMessage(_("NOTE: ENGINE SETUP FAILED"));
     QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
     setState(EngineSetupFailed);
-    d->m_runControl->startFailed();
+    QTC_ASSERT(d->m_runControl, /**/);
+    if (d->m_runControl)
+        d->m_runControl->startFailed();
     d->queueShutdownEngine();
 }
 
@@ -1055,7 +1065,9 @@ void DebuggerEngine::notifyEngineSetupOk()
     showMessage(_("NOTE: ENGINE SETUP OK"));
     QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
     setState(EngineSetupOk);
-    d->m_runControl->startSuccessful();
+    QTC_ASSERT(d->m_runControl, /**/);
+    if (d->m_runControl)
+        d->m_runControl->startSuccessful();
     showMessage(_("QUEUE: SETUP INFERIOR"));
     QTimer::singleShot(0, d, SLOT(doSetupInferior()));
 }
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index 1d4845b1692..6cd9fb8796c 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -213,6 +213,7 @@ public:
     QAbstractItemModel *sourceFilesModel() const;
 
     void handleFinished();
+    void handleStartFailed();
     bool debuggerActionsEnabled() const;
     static bool debuggerActionsEnabled(DebuggerState state);
     void showModuleSymbols(const QString &moduleName, const Symbols &symbols);
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 182eff9c2df..fb49cba4f8d 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -470,6 +470,7 @@ void DebuggerRunControl::startFailed()
 {
     m_running = false;
     emit finished();
+    engine()->handleStartFailed();
 }
 
 void DebuggerRunControl::handleStarted()
-- 
GitLab