diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2017-01-05 15:16:41 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2017-01-05 17:01:57 +0000 |
commit | a64a0ef5fc454b18a9474b39517a100d8f1fdf3c (patch) | |
tree | 4cca84f4a6746a087e7d3ef1e9d3c21d31b92bfe | |
parent | a6533f11d5d7129a86cfccf3248aa62081f31588 (diff) |
Do not leak the build graph locker if project resolving is cancelledv1.7.1
Task-number: QTCREATORBUG-17543
Change-Id: Ie32f5e9729dc98705b0d0d27839d9544ffd29a43
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r-- | src/lib/corelib/api/internaljobs.cpp | 6 | ||||
-rw-r--r-- | tests/auto/api/tst_api.cpp | 15 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/lib/corelib/api/internaljobs.cpp b/src/lib/corelib/api/internaljobs.cpp index d9b97329a..9bb619db5 100644 --- a/src/lib/corelib/api/internaljobs.cpp +++ b/src/lib/corelib/api/internaljobs.cpp @@ -237,8 +237,8 @@ TopLevelProjectPtr InternalSetupProjectJob::project() const void InternalSetupProjectJob::start() { - const TopLevelProjectConstPtr existingProject = m_existingProject; BuildGraphLocker *bgLocker = m_existingProject ? m_existingProject->bgLocker : 0; + bool deleteLocker = false; try { const ErrorInfo err = m_parameters.expandBuildConfiguration(); if (err.hasError()) @@ -253,17 +253,19 @@ void InternalSetupProjectJob::start() bgLocker = new BuildGraphLocker(ProjectBuildData::deriveBuildGraphFilePath(buildDir, projectId), logger(), m_parameters.waitLockBuildGraph(), observer()); + deleteLocker = true; } execute(); if (m_existingProject) m_existingProject->bgLocker = 0; m_newProject->bgLocker = bgLocker; + deleteLocker = false; } catch (const ErrorInfo &error) { m_newProject.clear(); setError(error); // Delete the build graph locker if and only if we allocated it here. - if (!existingProject) + if (deleteLocker) delete bgLocker; } emit finished(this); diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index cbc0a5237..284b04e07 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -283,7 +283,7 @@ void TestApi::buildGraphLocking() qPrintable(setupJob->error().toString())); QVERIFY2(QFileInfo(lockFile).isFile(), qPrintable(lockFile)); - // Case 3: Changing the build directory of an existing project to something con-competing. + // Case 3: Changing the build directory of an existing project to something non-competing. qbs::SetupProjectParameters setupParams3 = setupParams2; setupParams3.setBuildRoot(setupParams.buildRoot() + "/3"); setupJob.reset(qbs::Project().setupProject(setupParams3, m_logSink, 0)); @@ -294,6 +294,19 @@ void TestApi::buildGraphLocking() const QString newLockFile = setupParams3.buildRoot() + '/' + buildDirName + '/' + buildDirName + ".bg.lock"; QVERIFY2(QFileInfo(newLockFile).isFile(), qPrintable(newLockFile)); + qbs::Project project3 = setupJob->project(); + QVERIFY(project3.isValid()); + + // Case 4: Changing the build directory again, but cancelling the job. + setupJob.reset(project3.setupProject(setupParams2, m_logSink, 0)); + setupJob->cancel(); + waitForFinished(setupJob.data()); + QVERIFY(setupJob->error().hasError()); + QVERIFY2(!QFileInfo(lockFile).exists(), qPrintable(lockFile)); + QVERIFY2(QFileInfo(newLockFile).isFile(), qPrintable(newLockFile)); + setupJob.reset(nullptr); + project3 = qbs::Project(); + QVERIFY2(!QFileInfo(newLockFile).exists(), qPrintable(newLockFile)); } void TestApi::buildProject() |