aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-01-05 15:16:41 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2017-01-05 17:01:57 +0000
commita64a0ef5fc454b18a9474b39517a100d8f1fdf3c (patch)
tree4cca84f4a6746a087e7d3ef1e9d3c21d31b92bfe
parenta6533f11d5d7129a86cfccf3248aa62081f31588 (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.cpp6
-rw-r--r--tests/auto/api/tst_api.cpp15
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()