From e4f253ea2bca1889a815b574e806e459b142a8ee Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Tue, 29 Sep 2009 08:51:28 +0200
Subject: [PATCH] Trk/Debugger: Invoke memory read callback directly if no
 requests

are sent.
---
 src/plugins/debugger/gdb/trkgdbadapter.cpp | 20 ++++++++++++++++----
 src/plugins/debugger/gdb/trkgdbadapter.h   |  1 +
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/plugins/debugger/gdb/trkgdbadapter.cpp b/src/plugins/debugger/gdb/trkgdbadapter.cpp
index daaa4fa066c..f45268fe6da 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.cpp
+++ b/src/plugins/debugger/gdb/trkgdbadapter.cpp
@@ -1155,7 +1155,11 @@ void TrkGdbAdapter::reportReadMemoryBuffered(const TrkResult &result)
     const qulonglong cookie = result.cookie.toULongLong();
     const uint addr = cookie >> 32;
     const uint len = uint(cookie);
+    reportReadMemoryBuffered(addr, len);
+}
 
+void TrkGdbAdapter::reportReadMemoryBuffered(uint addr, uint len)
+{
     // Gdb accepts less memory according to documentation.
     // Send E on complete failure.
     QByteArray ba;
@@ -1320,6 +1324,7 @@ void TrkGdbAdapter::readMemory(uint addr, uint len)
             .arg(len).arg(addr, 0, 16).arg(MemoryChunkSize));
 
     if (m_bufferedMemoryRead) {
+        uint requests = 0;
         uint blockaddr = (addr / MemoryChunkSize) * MemoryChunkSize;
         for (; blockaddr < addr + len; blockaddr += MemoryChunkSize) {
             if (!m_snapshot.memory.contains(blockaddr)) {
@@ -1330,12 +1335,19 @@ void TrkGdbAdapter::readMemory(uint addr, uint len)
                 sendTrkMessage(0x10, TrkCB(handleReadMemoryBuffered),
                     trkReadMemoryMessage(blockaddr, MemoryChunkSize),
                     QVariant(blockaddr));
+                requests++;
             }
         }
-        const qulonglong cookie = (qulonglong(addr) << 32) + len;
-        sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, TrkCB(reportReadMemoryBuffered),
-            QByteArray(), cookie);
-    } else {
+        // If requests have been sent: Sync
+        if (requests) {
+            const qulonglong cookie = (qulonglong(addr) << 32) + len;
+            sendTrkMessage(TRK_WRITE_QUEUE_NOOP_CODE, TrkCB(reportReadMemoryBuffered),
+                QByteArray(), cookie);
+        } else {
+            // Everything is already buffered: invoke callback directly
+            reportReadMemoryBuffered(addr, len);
+        }
+    } else { // Unbuffered, direct requests
         if (m_verbose)
             logMessage(QString::fromLatin1("Requesting unbuffered memory %1 "
                 "bytes from 0x%2").arg(len).arg(addr, 0, 16));
diff --git a/src/plugins/debugger/gdb/trkgdbadapter.h b/src/plugins/debugger/gdb/trkgdbadapter.h
index fb8420446fd..38ec1d35af3 100644
--- a/src/plugins/debugger/gdb/trkgdbadapter.h
+++ b/src/plugins/debugger/gdb/trkgdbadapter.h
@@ -170,6 +170,7 @@ public:
     void handleStepOver2(const TrkResult &result);
     void handleReadRegisters(const TrkResult &result);
     void reportReadMemoryBuffered(const TrkResult &result);
+    void reportReadMemoryBuffered(uint addr, uint len);
     void handleWriteRegister(const TrkResult &result);
     void reportToGdb(const TrkResult &result);
 
-- 
GitLab