diff options
author | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2016-05-30 12:31:13 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2016-05-30 12:53:24 +0000 |
commit | 299d93e77be421f1fa6fbb3f06701113013b4e11 (patch) | |
tree | 968c71452ff7d3d5cafa7f32f14b88b34d16c939 | |
parent | 0e331a2e2946385d2a86fcf2d13027a8e4003484 (diff) | |
download | qt-creator-299d93e77be421f1fa6fbb3f06701113013b4e11.tar.gz |
QbsProjectManager: Fix crash on project unloading.
We can't just blindly delete the qbs jobs after cancelling them, as that
is not a synchronous operation.
Task-number: QTCREATORBUG-16273
Change-Id: I29787da857e70404a1be1b4bc54921f5a8ce448b
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsprojectparser.cpp | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp index 22fc1112d9..d477062341 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectparser.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectparser.cpp @@ -59,18 +59,18 @@ QbsProjectParser::QbsProjectParser(QbsProject *project, QFutureInterface<bool> * QbsProjectParser::~QbsProjectParser() { - if (m_qbsSetupProjectJob) { - m_qbsSetupProjectJob->disconnect(this); - m_qbsSetupProjectJob->cancel(); - m_qbsSetupProjectJob->deleteLater(); - m_qbsSetupProjectJob = 0; - } - if (m_ruleExecutionJob) { - m_ruleExecutionJob->disconnect(this); - m_ruleExecutionJob->cancel(); - m_ruleExecutionJob->deleteLater(); - m_ruleExecutionJob = 0; - } + const auto deleteJob = [this](qbs::AbstractJob *job) { + if (!job) + return; + if (job->state() == qbs::AbstractJob::StateFinished) { + job->deleteLater(); + return; + } + connect(job, &qbs::AbstractJob::finished, job, &qbs::AbstractJob::deleteLater); + job->cancel(); + }; + deleteJob(m_qbsSetupProjectJob); + deleteJob(m_ruleExecutionJob); m_fi = 0; // we do not own m_fi, do not delete } |