From 1a27681c784603f505052bcebbffd7bc5920e486 Mon Sep 17 00:00:00 2001
From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Date: Mon, 12 Oct 2009 16:39:13 +0200
Subject: [PATCH] change trk adapter setup sequence

gdb can be started before the debugee, so do it. that's more in line
with the other adapters.
---
 src/plugins/debugger/gdb/trkgdbadapter.cpp | 154 ++++++++++-----------
 src/plugins/debugger/gdb/trkgdbadapter.h   |   5 +-
 2 files changed, 80 insertions(+), 79 deletions(-)

diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index 4a249dfa3ed..4605044bf6a 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -391,7 +391,7 @@ void TrkGdbAdapter::slotEmitDelayedAdapterStartFailed()
     emit adapterStartFailed(m_adapterFailMessage, TrkOptionsPage::settingsId());
 }
 
-void TrkGdbAdapter::startInferiorEarly()
+void TrkGdbAdapter::waitForTrkConnect()
 {
     QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
     QString errorMessage;
@@ -406,7 +406,7 @@ void TrkGdbAdapter::startInferiorEarly()
         }
         // Do not loop forever
         if (m_waitCount++ < (m_options->mode == TrkOptions::BlueTooth ? 60 : 5)) {
-            QTimer::singleShot(1000, this, SLOT(startInferiorEarly()));
+            QTimer::singleShot(1000, this, SLOT(waitForTrkConnect()));
         } else {
             QString msg = _("Failed to connect to %1 after "
                 "%2 attempts").arg(device).arg(m_waitCount);
@@ -426,14 +426,7 @@ void TrkGdbAdapter::startInferiorEarly()
     //    "10 " + formatString("C:\\data\\usingdlls.sisx")); // Open File
     //sendTrkMessage(0x4B, 0, "00 00 00 01 73 1C 3A C8"); // Close File
 
-    QByteArray ba;
-    appendByte(&ba, 0); // ?
-    appendByte(&ba, 0); // ?
-    appendByte(&ba, 0); // ?
-
-    appendString(&ba, m_remoteExecutable.toLatin1(), TargetByteOrder);
-    sendTrkMessage(0x40, TrkCB(handleCreateProcess), ba); // Create Item
-    //sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, TrkCB(startGdbServer));
+    maybeAdapterStarted();
 }
 
 void TrkGdbAdapter::logMessage(const QString &msg)
@@ -1143,35 +1136,6 @@ void TrkGdbAdapter::handleCpuType(const TrkResult &result)
     logMessage(logMsg);
 }
 
-void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
-{
-    QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
-    //  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());
-        // Delay cleanup as not to close a trk device from its read handler,
-        // which blocks.
-        emitDelayedAdapterStartFailed(msg);
-        return;
-    }
-    const char *data = result.data.data();
-    m_session.pid = extractInt(data + 1);
-    m_session.tid = extractInt(data + 5);
-    m_session.codeseg = extractInt(data + 9);
-    m_session.dataseg = extractInt(data + 13);
-
-    logMessage("PID: " + hexxNumber(m_session.pid));
-    logMessage("TID: " + hexxNumber(m_session.tid));
-    logMessage("COD: " + hexxNumber(m_session.codeseg));
-    logMessage("DAT: " + hexxNumber(m_session.dataseg));
-
-    startGdb();
-}
-
 void TrkGdbAdapter::handleDeleteProcess(const TrkResult &result)
 {
     Q_UNUSED(result);
@@ -1580,10 +1544,17 @@ void TrkGdbAdapter::handleGdbFinished(int exitCode, QProcess::ExitStatus exitSta
 
 void TrkGdbAdapter::handleGdbStarted()
 {
-    QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
     logMessage(QString("GDB: Process Started"));
-    setState(AdapterStarted);
-    emit adapterStarted();
+    maybeAdapterStarted();
+}
+
+void TrkGdbAdapter::maybeAdapterStarted()
+{
+    QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
+    if (m_gdbProc.state() == QProcess::Running && m_trkDevice.isOpen()) {
+        setState(AdapterStarted);
+        emit adapterStarted();
+    }
 }
 
 void TrkGdbAdapter::handleGdbStateChanged(QProcess::ProcessState newState)
@@ -1634,15 +1605,76 @@ void TrkGdbAdapter::startAdapter()
     }
     m_waitCount = 0;
 
-    startInferiorEarly();
+    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());
+        logMessage(msg);
+        emit adapterStartFailed(msg, TrkOptionsPage::settingsId());
+        return;
+    }
+
+    logMessage(QString("Gdb server running on %1.\nLittle endian assumed.")
+        .arg(m_gdbServerName));
+
+    connect(m_gdbServer, SIGNAL(newConnection()),
+        this, SLOT(handleGdbConnection()));
+
+    logMessage("STARTING GDB");
+    logMessage(_("### Starting gdb %1").arg(m_options->gdb));
+    QStringList gdbArgs;
+    gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file
+    gdbArgs.append(QLatin1String("-i"));
+    gdbArgs.append(QLatin1String("mi"));
+    m_gdbProc.start(m_options->gdb, gdbArgs);
+
+    waitForTrkConnect();
 }
 
 void TrkGdbAdapter::prepareInferior()
 {
     QTC_ASSERT(state() == AdapterStarted, qDebug() << state());
-    // We already started the inferior process during the adapter start.
-    // Now make gdb aware of it.
     setState(InferiorPreparing);
+
+    QByteArray ba;
+    appendByte(&ba, 0); // ?
+    appendByte(&ba, 0); // ?
+    appendByte(&ba, 0); // ?
+
+    appendString(&ba, m_remoteExecutable.toLatin1(), TargetByteOrder);
+    sendTrkMessage(0x40, TrkCB(handleCreateProcess), ba); // Create Item
+    //sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, TrkCB(startGdbServer));
+}
+
+void TrkGdbAdapter::handleCreateProcess(const TrkResult &result)
+{
+    QTC_ASSERT(state() == InferiorPreparing, qDebug() << state());
+    //  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());
+        // Delay cleanup as not to close a trk device from its read handler,
+        // which blocks.
+        emitDelayedAdapterStartFailed(msg);
+        return;
+    }
+    const char *data = result.data.data();
+    m_session.pid = extractInt(data + 1);
+    m_session.tid = extractInt(data + 5);
+    m_session.codeseg = extractInt(data + 9);
+    m_session.dataseg = extractInt(data + 13);
+
+    logMessage("PID: " + hexxNumber(m_session.pid));
+    logMessage("TID: " + hexxNumber(m_session.tid));
+    logMessage("COD: " + hexxNumber(m_session.codeseg));
+    logMessage("DAT: " + hexxNumber(m_session.dataseg));
+
     const QString fileName = m_symbolFile;
     if (m_symbolFile.isEmpty()) {
         logMessage(_("WARNING: No symbol file available."));
@@ -1686,38 +1718,6 @@ void TrkGdbAdapter::handleFirstContinue(const GdbResponse &record)
     }
 }
 
-void TrkGdbAdapter::startGdb()
-{
-    QTC_ASSERT(state() == AdapterStarting, qDebug() << state());
-    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());
-        logMessage(msg);
-        // Delay cleanup as not to close a trk device from its read handler,
-        // which blocks.
-        emitDelayedAdapterStartFailed(msg);
-        return;
-    }
-
-    logMessage(QString("Gdb server running on %1.\nLittle endian assumed.")
-        .arg(m_gdbServerName));
-
-    connect(m_gdbServer, SIGNAL(newConnection()),
-        this, SLOT(handleGdbConnection()));
-
-    logMessage("STARTING GDB");
-    logMessage(_("### Starting gdb %1").arg(m_options->gdb));
-    QStringList gdbArgs;
-    gdbArgs.append(QLatin1String("--nx")); // Do not read .gdbinit file
-    gdbArgs.append(QLatin1String("-i"));
-    gdbArgs.append(QLatin1String("mi"));
-    m_gdbProc.start(m_options->gdb, gdbArgs);
-}
-
 //
 // Rfcomm process handling
 //
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index 59f31e06b46..d5c9243bf3a 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -140,7 +140,6 @@ public:
     void setVerbose(int verbose) { m_verbose = verbose; }
     void setBufferedMemoryRead(bool b) { m_bufferedMemoryRead = b; }
     trk::Session &session() { return m_session; }
-    void startGdb();
 
     // Set a device (from the project) to override the settings.
     QString overrideTrkDevice() const;
@@ -180,7 +179,7 @@ private:
     void emitDelayedAdapterStartFailed(const QString &msg);
     Q_SLOT void slotEmitDelayedAdapterStartFailed();
 
-    Q_SLOT void startInferiorEarly();
+    Q_SLOT void waitForTrkConnect();
     void handleKill(const GdbResponse &response);
     void handleExit(const GdbResponse &response);
     void handleTargetRemote(const GdbResponse &response);
@@ -290,6 +289,8 @@ private:
     Q_SLOT void handleGdbStarted();
     Q_SLOT void handleGdbStateChanged(QProcess::ProcessState newState);
 
+    void maybeAdapterStarted();
+
     void logMessage(const QString &msg);  // triggers output() if m_verbose
     Q_SLOT void trkLogMessage(const QString &msg);
 
-- 
GitLab