diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2017-05-29 16:27:08 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2017-05-30 08:28:27 +0000 |
commit | ed342b0beda9ff171906043bac99b82105156cb5 (patch) | |
tree | 9f92f03bc26dc8db42e026393e86e6deb20aba66 /src/lib/corelib | |
parent | 1a4456c233b73ab08f7003b0196a30ae408b5c86 (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.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/api/project.cpp | 4 |
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 ¶meters, 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(). |