From c1e0a788ff1daa57181f79c8a1ef05baa7391bfc Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Wed, 1 Apr 2009 16:49:45 +0200
Subject: [PATCH] debugger: don't dead-lock when switching sessions while
 debugging

---
 src/plugins/debugger/debuggermanager.cpp |  9 +++++++++
 src/plugins/debugger/debuggermanager.h   |  1 +
 src/plugins/debugger/debuggerplugin.cpp  |  2 ++
 src/plugins/debugger/gdbengine.cpp       |  4 ++++
 src/plugins/debugger/registerhandler.h   |  1 -
 src/plugins/projectexplorer/session.cpp  | 10 +++++-----
 6 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 561397ed36e..971eb1e8d9c 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -1053,6 +1053,15 @@ void DebuggerManager::sessionLoaded()
     loadSessionData();
 }
 
+void DebuggerManager::sessionUnloaded()
+{
+    cleanupViews();
+    if (m_engine)
+        m_engine->shutdown();
+    setStatus(DebuggerProcessNotReady);
+    setBusyCursor(false);
+}
+
 void DebuggerManager::aboutToSaveSession()
 {
     saveSessionData();
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 4d9351d951d..fb6bc9e36cf 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -233,6 +233,7 @@ public slots:
     void updateWatchModel();
     
     void sessionLoaded();
+    void sessionUnloaded();
     void aboutToSaveSession();
 
     void assignValueInDebugger();
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 1046a9307ba..2ecd00ffc2a 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -752,6 +752,8 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
        m_manager, SLOT(sessionLoaded()));
     connect(sessionManager(), SIGNAL(aboutToSaveSession()),
        m_manager, SLOT(aboutToSaveSession()));
+    connect(sessionManager(), SIGNAL(sessionUnloaded()),
+       m_manager, SLOT(sessionUnloaded()));
 
     // EditorManager
     QObject *editorManager = core->editorManager();
diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp
index 600a399f256..17cb99081ac 100644
--- a/src/plugins/debugger/gdbengine.cpp
+++ b/src/plugins/debugger/gdbengine.cpp
@@ -398,6 +398,10 @@ void GdbEngine::handleResponse(const QByteArray &buff)
                 // Archer has "{id="28902"}" 
             } else if (asyncClass == "thread-created") {
                 //"{id="1",group-id="28902"}" 
+            } else if (asyncClass == "thread-group-exited") {
+                // Archer has "{id="28902"}" 
+            } else if (asyncClass == "thread-exited") {
+                //"{id="1",group-id="28902"}" 
             #ifdef Q_OS_MAC
             } else if (asyncClass == "shlibs-updated") {
                 // MAC announces updated libs
diff --git a/src/plugins/debugger/registerhandler.h b/src/plugins/debugger/registerhandler.h
index 8c38c1544e7..57e138b2edd 100644
--- a/src/plugins/debugger/registerhandler.h
+++ b/src/plugins/debugger/registerhandler.h
@@ -54,7 +54,6 @@ class RegisterHandler : public QAbstractTableModel
 public:
     RegisterHandler(QObject *parent = 0);
 
-    void sessionClosed();
     QAbstractItemModel *model() { return this; }
 
     bool isEmpty() const; // nothing known so far?
diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index 54d46e2e5bf..ad09041e9cf 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -996,16 +996,16 @@ void SessionManager::removeProjects(QList<Project *> remove)
 
 void SessionManager::setValue(const QString &name, const QVariant &value)
 {
-    m_file->m_values.insert(name, value);
+    if (m_file)
+        m_file->m_values.insert(name, value);
 }
 
 QVariant SessionManager::value(const QString &name)
 {
-    QMap<QString, QVariant>::const_iterator it = m_file->m_values.find(name);
-    if (it != m_file->m_values.constEnd())
-        return *it;
-    else
+    if (!m_file)
         return QVariant();
+    QMap<QString, QVariant>::const_iterator it = m_file->m_values.find(name);
+    return (it == m_file->m_values.constEnd()) ? QVariant() : *it;
 }
 
 QString SessionManager::activeSession() const
-- 
GitLab