From 0e8c3875ef4210c7bfa8548fe90033de89ea5f54 Mon Sep 17 00:00:00 2001
From: Arvid Ephraim Picciani <arvid.picciani@nokia.com>
Date: Tue, 14 Sep 2010 12:57:24 +0200
Subject: [PATCH] Debugger: test gdb threeadlist capability Reviewed-by: hjk

---
 share/qtcreator/gdbmacros/dumper.py    | 9 ++++++++-
 src/plugins/debugger/gdb/gdbengine.cpp | 5 ++++-
 src/plugins/debugger/gdb/gdbengine.h   | 1 +
 3 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index 97f736b7b9c..ebc3b093463 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -89,6 +89,13 @@ def isGoodGdb():
     #   and gdb.VERSION != "6.8.50.20090630-cvs"
     return 'parse_and_eval' in __builtin__.dir(gdb)
 
+def hasInferiorThreadList():
+    try:
+        a= gdb.inferiors()[0].threads()
+        return True
+    except:
+        return False
+
 typeCache = {}
 
 def lookupType(typestring):
@@ -912,6 +919,7 @@ def bbsetup():
     for key, value in qqFormats.items():
         result += '{type="%s",formats="%s"},' % (key, value)
     result += '],namespace="%s"' % qqNs
+    result += ',hasInferiorThreadList="%s"' % int(hasInferiorThreadList())
     return result
 
 
@@ -1715,7 +1723,6 @@ class ThreadNamesCommand(gdb.Command):
                 if e.name() == self.ns + "QThreadPrivate::start":
                     thrptr = e.read_var("thr").dereference()
                     d_ptr = thrptr["d_ptr"]["d"].cast(lookupType(self.ns + "QObjectPrivate").pointer()).dereference()
-                    #warn("D_PTR: %s " % d_ptr)
                     objectName = d_ptr["objectName"]
                     i = 0
                     out += '{valueencoded="' + str(Hex4EncodedLittleEndianWithoutQuotes)+'",id="'
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 45a5761472b..fbd64176855 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -1538,6 +1538,8 @@ void GdbEngine::handleHasPython(const GdbResponse &response)
             formats.append(reported.split(_(","), QString::SkipEmptyParts));
             watchHandler()->addTypeFormats(type, formats);
         }
+        const GdbMi hasInferiorThreadList = data.findChild("hasInferiorThreadList");
+        m_hasInferiorThreadList = (hasInferiorThreadList.data().toInt() != 0);
     } else {
         m_hasPython = false;
         if (m_gdbAdapter->dumperHandling()
@@ -2963,7 +2965,8 @@ void GdbEngine::handleThreadInfo(const GdbResponse &response)
             response.data.findChild("current-thread-id").data().toInt();
         threadsHandler()->setCurrentThreadId(currentThreadId);
         plugin()->updateState(this); // Adjust Threads combobox.
-        postCommand("threadnames " + theDebuggerAction(MaximalStackDepth)->value().toByteArray(), CB(handleThreadNames), id);
+        if (m_hasInferiorThreadList)
+            postCommand("threadnames " + theDebuggerAction(MaximalStackDepth)->value().toByteArray(), CB(handleThreadNames), id);
     } else {
         // Fall back for older versions: Try to get at least a list
         // of running threads.
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 25bf1e28f52..24ffdc63294 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -302,6 +302,7 @@ private: ////////// Gdb Output, State & Capability Handling //////////
     int m_gdbBuildVersion; // MAC only?
     bool m_isMacGdb;
     bool m_hasPython;
+    bool m_hasInferiorThreadList;
 
 private: ////////// Inferior Management //////////
 
-- 
GitLab