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