From c60f1468d3a47c63405b3e374615f5c4d2c87aa5 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Wed, 30 Sep 2009 09:16:55 +0200
Subject: [PATCH] debugger: improve trk shutdown

---
 src/plugins/debugger/debuggermanager.cpp   |  2 +-
 src/plugins/debugger/gdb/trkgdbadapter.cpp | 41 ++++++++++++++++------
 src/plugins/debugger/gdb/trkgdbadapter.h   |  2 +-
 3 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 67b1a454c47..f1474fc7b79 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -1628,7 +1628,7 @@ void DebuggerManager::setState(DebuggerState state)
     QString msg = _("State changed from %1(%2) to %3(%4).")
         .arg(stateName(d->m_state)).arg(d->m_state).arg(stateName(state)).arg(state);
     //if (!((d->m_state == -1 && state == 0) || (d->m_state == 0 && state == 0)))
-    //    qDebug() << msg << d->m_state << state;
+    //    qDebug() << msg;
     if (!isAllowedTransition(d->m_state, state))
         qDebug() << "UNEXPECTED STATE TRANSITION: " << msg;
 
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index 6b3a78d5724..3aa068362a9 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -95,6 +95,8 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
     m_bufferedMemoryRead(true),
     m_waitCount(0)
 {
+    m_gdbServer = 0;
+    m_gdbConnection = 0;
 #ifdef Q_OS_WIN
     const DWORD portOffset = GetCurrentProcessId() % 100;
 #else
@@ -141,7 +143,7 @@ TrkGdbAdapter::TrkGdbAdapter(GdbEngine *engine, const TrkOptionsPtr &options) :
 
 TrkGdbAdapter::~TrkGdbAdapter()
 {
-    m_gdbServer.close();
+    delete m_gdbServer;
     logMessage("Shutting down.\n");
 }
 
@@ -257,7 +259,6 @@ void TrkGdbAdapter::startInferiorEarly()
             QString msg = QString::fromLatin1("Failed to connect to %1 after "
                 "%2 attempts").arg(device).arg(m_waitCount);
             logMessage(msg);
-            setState(DebuggerNotReady);
             emit adapterStartFailed(msg);
         }
         return;
@@ -300,8 +301,9 @@ void TrkGdbAdapter::logMessage(const QString &msg)
 void TrkGdbAdapter::handleGdbConnection()
 {
     logMessage("HANDLING GDB CONNECTION");
-
-    m_gdbConnection = m_gdbServer.nextPendingConnection();
+    QTC_ASSERT(m_gdbConnection == 0, /**/);
+    m_gdbConnection = m_gdbServer->nextPendingConnection();
+    QTC_ASSERT(m_gdbConnection, return);
     connect(m_gdbConnection, SIGNAL(disconnected()),
             m_gdbConnection, SLOT(deleteLater()));
     connect(m_gdbConnection, SIGNAL(readyRead()),
@@ -315,6 +317,7 @@ static inline QString msgGdbPacket(const QString &p)
 
 void TrkGdbAdapter::readGdbServerCommand()
 {
+    QTC_ASSERT(m_gdbConnection, return);
     QByteArray packet = m_gdbConnection->readAll();
     m_gdbReadBuffer.append(packet);
 
@@ -1000,6 +1003,14 @@ void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
     //  40 00 00]
     //logMessage("       RESULT: " + result.toString());
     // [80 08 00   00 00 01 B5   00 00 01 B6   78 67 40 00   00 40 00 00]
+    if (result.errorCode()) {
+        logMessage("ERROR: " + result.errorString());
+        QString msg = _("Cannot start executable \"%1\" on the device:\n%2")
+            .arg(m_remoteExecutable).arg(result.errorString());
+        //m_trkDevice.close();
+        emit adapterStartFailed(msg);
+        return;
+    }
     const char *data = result.data.data();
     m_session.pid = extractInt(data + 1);
     m_session.tid = extractInt(data + 5);
@@ -1481,7 +1492,7 @@ void TrkGdbAdapter::startInferior()
 
 void TrkGdbAdapter::handleFirstContinue(const GdbResponse &record)
 {
-    QTC_ASSERT(state() == InferiorRunningRequested, qDebug() << state());
+    QTC_ASSERT(state() == InferiorRunning, qDebug() << state());
     if (record.resultClass == GdbResultDone) {
         debugMessage(_("INFERIOR STARTED"));
         showStatusMessage(tr("Inferior running."));
@@ -1518,11 +1529,14 @@ static void setGdbCygwinEnvironment(const QString &cygwin, QProcess *process)
 void TrkGdbAdapter::startGdb()
 {
     QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
-    if (!m_gdbServer.listen(QHostAddress(gdbServerIP()), gdbServerPort())) {
+    QTC_ASSERT(m_gdbServer == 0, delete m_gdbServer);
+    QTC_ASSERT(m_gdbConnection == 0, m_gdbConnection = 0);
+    m_gdbServer = new QTcpServer(this);
+    
+    if (!m_gdbServer->listen(QHostAddress(gdbServerIP()), gdbServerPort())) {
         QString msg = QString("Unable to start the gdb server at %1: %2.")
-            .arg(m_gdbServerName).arg(m_gdbServer.errorString());
+            .arg(m_gdbServerName).arg(m_gdbServer->errorString());
         logMessage(msg);
-        setState(DebuggerNotReady);
         emit adapterStartFailed(msg); 
         return;
     }
@@ -1530,7 +1544,7 @@ void TrkGdbAdapter::startGdb()
     logMessage(QString("Gdb server running on %1.\nLittle endian assumed.")
         .arg(m_gdbServerName));
 
-    connect(&m_gdbServer, SIGNAL(newConnection()),
+    connect(m_gdbServer, SIGNAL(newConnection()),
         this, SLOT(handleGdbConnection()));
 
     logMessage("STARTING GDB");
@@ -1692,6 +1706,10 @@ void TrkGdbAdapter::shutdown()
 {
     switch (state()) {
 
+    case AdapterStarting:
+        setState(DebuggerNotReady);
+        return;
+
     case InferiorStopped:
     case InferiorStopping:
     case InferiorRunningRequested:
@@ -1702,7 +1720,10 @@ void TrkGdbAdapter::shutdown()
 
     case InferiorShutDown:
         setState(AdapterShuttingDown);
-        sendTrkMessage(0x02, TrkCB(handleDisconnect));
+        //sendTrkMessage(0x02, TrkCB(handleDisconnect));
+        m_trkDevice.close();
+        delete m_gdbServer;
+        m_gdbServer = 0;
         m_engine->postCommand(_("-gdb-exit"), CB(handleExit));
         return;
 
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index 3529bf33fe1..8bb30476d57 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -221,7 +221,7 @@ public:
     void logMessage(const QString &msg);  // triggers output() if m_verbose
     Q_SLOT void trkLogMessage(const QString &msg);
 
-    QTcpServer m_gdbServer;
+    QPointer<QTcpServer> m_gdbServer;
     QPointer<QTcpSocket> m_gdbConnection;
     QByteArray m_gdbReadBuffer;
     bool m_gdbAckMode;
-- 
GitLab