From b104b43fa00984fdd3ba1cd8e54fbb1604b9afbd Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 13 Aug 2009 17:10:53 +0200
Subject: [PATCH] sessionmanager: replace signal sessionUnloaded() by
 aboutToUnloadSession()

sessionUnloaded was sometimes emitted when the session manager was in
an unsafe state (between delete m_file and  m_file = new ...) leading
to crashes when slots connected to the signal accessed the sessionmanager
again. This patch moves the signal emission before  delete m_file.

Reviewed-by: dt
---
 src/plugins/cpptools/cppmodelmanager.cpp | 6 +++---
 src/plugins/cpptools/cppmodelmanager.h   | 2 +-
 src/plugins/debugger/debuggermanager.cpp | 2 +-
 src/plugins/debugger/debuggermanager.h   | 2 +-
 src/plugins/debugger/debuggerplugin.cpp  | 4 ++--
 src/plugins/projectexplorer/session.cpp  | 7 +++----
 src/plugins/projectexplorer/session.h    | 2 +-
 7 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 094c1245e36..d14753a4681 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -611,8 +611,8 @@ CppModelManager::CppModelManager(QObject *parent)
     connect(session, SIGNAL(aboutToRemoveProject(ProjectExplorer::Project *)),
             this, SLOT(onAboutToRemoveProject(ProjectExplorer::Project *)));
 
-    connect(session, SIGNAL(sessionUnloaded()),
-            this, SLOT(onSessionUnloaded()));
+    connect(session, SIGNAL(aboutToUnloadSession()),
+            this, SLOT(onAboutToUnloadSession()));
 
     qRegisterMetaType<CPlusPlus::Document::Ptr>("CPlusPlus::Document::Ptr");
 
@@ -1078,7 +1078,7 @@ void CppModelManager::onAboutToRemoveProject(ProjectExplorer::Project *project)
     GC();
 }
 
-void CppModelManager::onSessionUnloaded()
+void CppModelManager::onAboutToUnloadSession()
 {
     if (m_core->progressManager()) {
         m_core->progressManager()->cancelTasks(CppTools::Constants::TASK_INDEX);
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index e911971773e..66d77c8194d 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -118,7 +118,7 @@ private Q_SLOTS:
     // this should be executed in the GUI thread.
     void onDocumentUpdated(CPlusPlus::Document::Ptr doc);
     void onAboutToRemoveProject(ProjectExplorer::Project *project);
-    void onSessionUnloaded();
+    void onAboutToUnloadSession();
     void onProjectAdded(ProjectExplorer::Project *project);
     void postEditorUpdate();
     void updateEditorSelections();
diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp
index 5776cfd7551..e5925f71e24 100644
--- a/src/plugins/debugger/debuggermanager.cpp
+++ b/src/plugins/debugger/debuggermanager.cpp
@@ -1046,7 +1046,7 @@ void DebuggerManager::sessionLoaded()
     loadSessionData();
 }
 
-void DebuggerManager::sessionUnloaded()
+void DebuggerManager::aboutToUnloadSession()
 {
     cleanupViews();
     if (m_engine)
diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h
index 2313503874d..72806c60db6 100644
--- a/src/plugins/debugger/debuggermanager.h
+++ b/src/plugins/debugger/debuggermanager.h
@@ -311,7 +311,7 @@ public slots:
     void updateWatchData(const WatchData &data);
 
     void sessionLoaded();
-    void sessionUnloaded();
+    void aboutToUnloadSession();
     void aboutToSaveSession();
 
     void assignValueInDebugger();
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 0ea4fd85003..01dc96476e5 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -871,8 +871,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()));
+    connect(sessionManager(), SIGNAL(aboutToUnloadSession()),
+       m_manager, SLOT(aboutToUnloadSession()));
 
     // EditorManager
     QObject *editorManager = core->editorManager();
diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index 09dcb6e1491..0759061694a 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -399,8 +399,8 @@ SessionManager::SessionManager(QObject *parent)
 
 SessionManager::~SessionManager()
 {
+    emit aboutToUnloadSession();
     delete m_file;
-    emit sessionUnloaded();
 }
 
 
@@ -598,8 +598,8 @@ bool SessionManager::createImpl(const QString &fileName)
     }
 
     if (success) {
+        emit aboutToUnloadSession();
         delete m_file;
-        emit sessionUnloaded();
         m_file = new SessionFile;
         m_file->setFileName(fileName);
         setStartupProject(defaultStartupProject());
@@ -633,9 +633,8 @@ bool SessionManager::loadImpl(const QString &fileName)
     }
 
     if (success) {
+        emit aboutToUnloadSession();
         delete m_file;
-        m_file = 0;
-        emit sessionUnloaded();
         m_file = new SessionFile;
         if (!m_file->load(fileName)) {
             QMessageBox::warning(0, tr("Error while restoring session"),
diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h
index 063f72f74b8..654877e4da4 100644
--- a/src/plugins/projectexplorer/session.h
+++ b/src/plugins/projectexplorer/session.h
@@ -159,8 +159,8 @@ signals:
 
     void startupProjectChanged(ProjectExplorer::Project *project);
 
-    void sessionUnloaded();
     void sessionLoaded();
+    void aboutToUnloadSession();
     void aboutToSaveSession();
     void dependencyChanged(ProjectExplorer::Project *a, ProjectExplorer::Project *b);
 
-- 
GitLab