summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2020-04-14 13:34:49 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2020-04-14 15:15:27 +0000
commit6c32656a21ede948be7adf01fe94b4bfb77c45a4 (patch)
tree4db0940260a5e2b5371ffb24f654236b0fa62c09 /src
parentd973823dbbe275bb4935324d58392df5644e5ad4 (diff)
downloadqt-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.cpp8
-rw-r--r--src/plugins/qbsprojectmanager/qbsbuildstep.cpp9
-rw-r--r--src/plugins/qbsprojectmanager/qbsbuildstep.h2
-rw-r--r--src/plugins/qbsprojectmanager/qbscleanstep.cpp9
-rw-r--r--src/plugins/qbsprojectmanager/qbscleanstep.h2
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;