aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-05-29 16:27:08 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2017-05-30 08:28:27 +0000
commited342b0beda9ff171906043bac99b82105156cb5 (patch)
tree9f92f03bc26dc8db42e026393e86e6deb20aba66 /src/lib/corelib
parent1a4456c233b73ab08f7003b0196a30ae408b5c86 (diff)
Fix race condition when resolving projects
Make sure we do not actually start resolving before returning to the code that created the job object. Otherwise signals could be missed. Change-Id: I2cf3db7c0777e2f6315c95ee15a21695f8b22c11 Reviewed-by: Jake Petroules <jake.petroules@qt.io> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/lib/corelib')
-rw-r--r--src/lib/corelib/api/internaljobs.cpp2
-rw-r--r--src/lib/corelib/api/project.cpp4
2 files changed, 5 insertions, 1 deletions
diff --git a/src/lib/corelib/api/internaljobs.cpp b/src/lib/corelib/api/internaljobs.cpp
index 5645e2a62..3094477b5 100644
--- a/src/lib/corelib/api/internaljobs.cpp
+++ b/src/lib/corelib/api/internaljobs.cpp
@@ -196,7 +196,7 @@ void InternalJobThreadWrapper::start()
setTimed(m_job->timed());
m_thread.start();
m_running = true;
- emit startRequested();
+ QTimer::singleShot(0, this, &InternalJobThreadWrapper::startRequested);
}
void InternalJobThreadWrapper::handleFinished()
diff --git a/src/lib/corelib/api/project.cpp b/src/lib/corelib/api/project.cpp
index 628ccb20c..fe9baa9b9 100644
--- a/src/lib/corelib/api/project.cpp
+++ b/src/lib/corelib/api/project.cpp
@@ -153,6 +153,7 @@ BuildJob *ProjectPrivate::buildProducts(const QList<ResolvedProductPtr> &product
BuildJob * const job = new BuildJob(logger, jobOwner);
job->build(internalProject, productsToBuild, options);
+ QBS_ASSERT(job->state() == AbstractJob::StateRunning,);
return job;
}
@@ -161,6 +162,7 @@ CleanJob *ProjectPrivate::cleanProducts(const QList<ResolvedProductPtr> &product
{
CleanJob * const job = new CleanJob(logger, jobOwner);
job->clean(internalProject, products, options);
+ QBS_ASSERT(job->state() == AbstractJob::StateRunning,);
return job;
}
@@ -172,6 +174,7 @@ InstallJob *ProjectPrivate::installProducts(const QList<ResolvedProductPtr> &pro
addDependencies(productsToInstall);
InstallJob * const job = new InstallJob(logger, jobOwner);
job->install(internalProject, productsToInstall, options);
+ QBS_ASSERT(job->state() == AbstractJob::StateRunning,);
return job;
}
@@ -901,6 +904,7 @@ SetupProjectJob *Project::setupProject(const SetupProjectParameters &parameters,
try {
loadPlugins(parameters.pluginPaths(), logger);
job->resolve(*this, parameters);
+ QBS_ASSERT(job->state() == AbstractJob::StateRunning,);
} catch (const ErrorInfo &error) {
// Throwing from here would complicate the API, so let's report the error the same way
// as all others, via AbstractJob::error().