From 9101e467e335bae2dffac6186b697faf34b7354b Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Mon, 24 Aug 2009 12:41:13 +0200
Subject: [PATCH] Trk: Handle threads and modules correctly

---
 tests/manual/trk/adapter.cpp | 34 ++++++++++++++++++++--------------
 tests/manual/trk/trkutils.h  |  3 ++-
 2 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/tests/manual/trk/adapter.cpp b/tests/manual/trk/adapter.cpp
index dda0bb43fd6..306f91737cd 100644
--- a/tests/manual/trk/adapter.cpp
+++ b/tests/manual/trk/adapter.cpp
@@ -442,12 +442,10 @@ void Adapter::handleGdbResponse(const QByteArray &response)
         // Indicate the reason the target halted.
         // The reply is the same as for step and continue.
         sendGdbAckMessage();
-        startInferiorIfNeeded();
-        //sendGdbMessageAfterSync("T05thread:p@PID@.@TID@;", "current thread Id");
-        //sendGdbMessageAfterSync("T05thread:@TID@;", "current thread Id");
-        //sendGdbMessage("T0505:00000000;04:e0c1ddbf;08:10f80bb8;thread:1f43;",
-        //    sendGdbMessage("T0505:00000000;thread:" + QByteArray(buf),
-        sendGdbMessage("S05", "target halted");
+        startInferiorIfNeeded();        
+        sendGdbMessage("T05library:r;", "target halted (library load)");
+        // trap 05
+        // sendGdbMessage("S05", "target halted (trap)");
     }
 
     else if (response == "c") {
@@ -517,7 +515,7 @@ void Adapter::handleGdbResponse(const QByteArray &response)
         // for 'other operations.  0 - any thread
         //$Hg0#df
         sendGdbAckMessage();
-        m_session.currentThread = response.mid(2).toInt();
+        m_session.currentThread = response.mid(2).toInt(0, 16);
         sendGdbMessage("OK", "set current thread "
             + QByteArray::number(m_session.currentThread));
     }
@@ -901,6 +899,7 @@ void Adapter::handleResult(const TrkResult &result)
             const uint dataseg = extractInt(data + 14); //data address: 4 bytes; data base address for the library
             const uint len = extractShort(data + 18); //length: 2 bytes; length of the library name string to follow
             const QByteArray name = result.data.mid(20, len); // name: library name
+            m_session.modules += QString::fromAscii(name);
             QString logMsg;
             QTextStream str(&logMsg);
             str<< prefix << " NOTE: LIBRARY LOAD: token=" << result.token;
@@ -916,7 +915,14 @@ void Adapter::handleResult(const TrkResult &result)
             break;
         }
         case 0xa1: { // NotifyDeleted
-            logMessage(prefix + "NOTE: LIBRARY UNLOAD: " + str);
+            const ushort itemType = (unsigned char)result.data.at(1);
+            const ushort len = result.data.size() > 12 ? extractShort(result.data.data() + 10) : ushort(0);
+            const QString name = len ? QString::fromAscii(result.data.mid(12, len)) : QString();
+            if (!name.isEmpty())
+                m_session.modules.removeAll(name);
+            logMessage(QString::fromLatin1("%1 %2 UNLOAD: %3").
+                       arg(QString::fromAscii(prefix)).arg(itemType ? QLatin1String("LIB") : QLatin1String("PROCESS")).
+                       arg(name));
             sendTrkAck(result.token);
             break;
         }
@@ -948,12 +954,12 @@ void Adapter::handleCpuType(const TrkResult &result)
     //  Command: 0x80 Acknowledge
     //    Error: 0x00
     // [80 03 00  04 00 00 04 00 00 00]
-    m_session.cpuMajor = result.data[0];
-    m_session.cpuMinor = result.data[1];
-    m_session.bigEndian = result.data[2];
-    m_session.defaultTypeSize = result.data[3];
-    m_session.fpTypeSize = result.data[4];
-    m_session.extended1TypeSize = result.data[5];
+    m_session.cpuMajor = result.data[1];
+    m_session.cpuMinor = result.data[2];
+    m_session.bigEndian = result.data[3];
+    m_session.defaultTypeSize = result.data[4];
+    m_session.fpTypeSize = result.data[5];
+    m_session.extended1TypeSize = result.data[6];
     //m_session.extended2TypeSize = result.data[6];
     QString logMsg;
     QTextStream(&logMsg) << "HANDLE CPU TYPE: " << " CPU=" << m_session.cpuMajor << '.'
diff --git a/tests/manual/trk/trkutils.h b/tests/manual/trk/trkutils.h
index e54efc6f6e9..42df54b680d 100644
--- a/tests/manual/trk/trkutils.h
+++ b/tests/manual/trk/trkutils.h
@@ -32,7 +32,7 @@
 
 #include <QtCore/QByteArray>
 #include <QtCore/QHash>
-#include <QtCore/QString>
+#include <QtCore/QStringList>
 #include <QtCore/QVariant>
 
 typedef unsigned char byte;
@@ -147,6 +147,7 @@ struct Session
 
     // Gdb request
     uint currentThread;
+    QStringList modules;
 };
 
 struct Snapshot
-- 
GitLab