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