forked from qt-creator/qt-creator
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>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -72,6 +72,8 @@ public:
|
||||
QbsBuildSystem *qbsBuildSystem() const;
|
||||
QbsBuildStepData stepData() const;
|
||||
|
||||
void dropSession();
|
||||
|
||||
signals:
|
||||
void qbsConfigurationChanged();
|
||||
void qbsBuildOptionsChanged();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -46,6 +46,8 @@ public:
|
||||
|
||||
QbsBuildStepData stepData() const;
|
||||
|
||||
void dropSession();
|
||||
|
||||
private:
|
||||
bool init() override;
|
||||
void doRun() override;
|
||||
|
||||
Reference in New Issue
Block a user