From 6c32656a21ede948be7adf01fe94b4bfb77c45a4 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 14 Apr 2020 13:34:49 +0200 Subject: QbsProjectManager: Fix crash when unloading a building project Note that unloading a building project is generally broken in that the build manager waits indefinitely for the build step's finished() signal, but that's a general problem which needs to get addressed in a different patch. This one fixes a qbs-specific crash. Fixes: QTCREATORBUG-23851 Change-Id: I93e254acd1c73fe7495d01fcad04ea9301130dd0 Reviewed-by: Ivan Komissarov Reviewed-by: Christian Stenger --- src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp | 8 ++++++++ src/plugins/qbsprojectmanager/qbsbuildstep.cpp | 9 +++++++++ src/plugins/qbsprojectmanager/qbsbuildstep.h | 2 ++ src/plugins/qbsprojectmanager/qbscleanstep.cpp | 9 +++++++++ src/plugins/qbsprojectmanager/qbscleanstep.h | 2 ++ 5 files changed, 30 insertions(+) (limited to 'src') diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index f2aac00591..b2d0811d8d 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -159,6 +159,14 @@ QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id) QbsBuildConfiguration::~QbsBuildConfiguration() { + for (BuildStep * const bs : buildSteps()->steps()) { + if (const auto qbs = qobject_cast(bs)) + qbs->dropSession(); + } + for (BuildStep * const cs : cleanSteps()->steps()) { + if (const auto qcs = qobject_cast(cs)) + qcs->dropSession(); + } delete m_buildSystem; } diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 9827cf672f..239276de77 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -539,6 +539,15 @@ QbsBuildStepData QbsBuildStep::stepData() const return data; } +void QbsBuildStep::dropSession() +{ + if (m_session) { + doCancel(); + m_session->disconnect(this); + m_session = nullptr; + } +} + // -------------------------------------------------------------------- // QbsBuildStepConfigWidget: diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h index 3c5249dfb0..d6766768c4 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.h +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h @@ -72,6 +72,8 @@ public: QbsBuildSystem *qbsBuildSystem() const; QbsBuildStepData stepData() const; + void dropSession(); + signals: void qbsConfigurationChanged(); void qbsBuildOptionsChanged(); diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.cpp b/src/plugins/qbsprojectmanager/qbscleanstep.cpp index f6753fa411..07adf568d2 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.cpp +++ b/src/plugins/qbsprojectmanager/qbscleanstep.cpp @@ -85,6 +85,15 @@ QbsCleanStep::~QbsCleanStep() m_session->disconnect(this); } +void QbsCleanStep::dropSession() +{ + if (m_session) { + doCancel(); + m_session->disconnect(this); + m_session = nullptr; + } +} + bool QbsCleanStep::init() { if (buildSystem()->isParsing() || m_session) diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.h b/src/plugins/qbsprojectmanager/qbscleanstep.h index 7af3d61fc7..f757afe9e0 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.h +++ b/src/plugins/qbsprojectmanager/qbscleanstep.h @@ -46,6 +46,8 @@ public: QbsBuildStepData stepData() const; + void dropSession(); + private: bool init() override; void doRun() override; -- cgit v1.2.1