diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2020-04-14 13:34:49 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2020-04-14 15:15:27 +0000 |
commit | 6c32656a21ede948be7adf01fe94b4bfb77c45a4 (patch) | |
tree | 4db0940260a5e2b5371ffb24f654236b0fa62c09 /src | |
parent | d973823dbbe275bb4935324d58392df5644e5ad4 (diff) | |
download | qt-creator-6c32656a21ede948be7adf01fe94b4bfb77c45a4.tar.gz |
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 <ABBAPOH@gmail.com>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp | 8 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsbuildstep.cpp | 9 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsbuildstep.h | 2 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbscleanstep.cpp | 9 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbscleanstep.h | 2 |
5 files changed, 30 insertions, 0 deletions
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<QbsBuildStep *>(bs)) + qbs->dropSession(); + } + for (BuildStep * const cs : cleanSteps()->steps()) { + if (const auto qcs = qobject_cast<QbsCleanStep *>(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; |