aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2023-07-31 07:48:20 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2023-07-31 11:12:17 +0000
commit870cdb12f762545f4d4187d7fccafbfbdac3921b (patch)
treec93ab0e62ddbffc2840b5d9a07d31d08c83f4468
parent1b84828caf029c6296c769787b2c4c7426ef686a (diff)
QbsBuildSystem: Properly queue parse requests
Rename parseCurrentBuildConfiguration() into startParsing(). Make startParsing() and cancelParsing() private members, accessible only for QbsRequestObject. Change the behavior of the public scheduleParsing() method. It now queues the parse request. The new call to scheduleParse() cancels any possible running parsing and queues the new request. Change-Id: Ia2459a98e299c04fa715e73ca349e303d5536d82 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--src/plugins/qbsprojectmanager/qbsbuildstep.cpp8
-rw-r--r--src/plugins/qbsprojectmanager/qbsproject.cpp26
-rw-r--r--src/plugins/qbsprojectmanager/qbsproject.h12
-rw-r--r--src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp10
-rw-r--r--src/plugins/qbsprojectmanager/qbsrequest.cpp5
5 files changed, 27 insertions, 34 deletions
diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
index c58e7fd4f8..40e30372e0 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp
@@ -425,11 +425,6 @@ GroupItem QbsBuildStep::runRecipe()
});
return SetupResult::Continue;
};
- const auto onPostParserSetup = [this](QbsRequest &request) {
- auto bs = qbsBuildSystem();
- request.setParseData(bs);
- return bs->parsingScheduled() ? SetupResult::Continue : SetupResult::StopWithDone;
- };
const Group root {
// We need a pre-build parsing step in order not to lose project file changes done
@@ -440,9 +435,6 @@ GroupItem QbsBuildStep::runRecipe()
QbsRequestTask(onBuildSetup),
// Building can uncover additional target artifacts.
Sync([this] { qbsBuildSystem()->updateAfterBuild(); }),
- // The reparsing, if it is necessary, has to be done before done() is emitted, as
- // otherwise a potential additional build step could conflict with the parsing step.
- QbsRequestTask(onPostParserSetup)
}
};
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 74411ef3a4..c9cc99a7ef 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -13,6 +13,7 @@
#include "qbsprojectmanagerconstants.h"
#include "qbsprojectmanagertr.h"
#include "qbsprojectparser.h"
+#include "qbsrequest.h"
#include "qbssession.h"
#include "qbssettings.h"
@@ -198,6 +199,7 @@ QbsBuildSystem::QbsBuildSystem(QbsBuildConfiguration *bc)
QbsBuildSystem::~QbsBuildSystem()
{
+ m_parseRequest.reset();
delete m_cppCodeModelUpdater;
delete m_qbsProjectParser;
if (m_qbsUpdateFutureInterface) {
@@ -434,7 +436,7 @@ bool QbsBuildSystem::checkCancelStatus()
m_qbsProjectParser = nullptr;
m_treeCreationWatcher = nullptr;
m_guard = {};
- parseCurrentBuildConfiguration();
+ startParsing();
return true;
}
@@ -564,14 +566,7 @@ void QbsBuildSystem::changeActiveTarget(Target *t)
void QbsBuildSystem::triggerParsing()
{
- // Qbs does update the build graph during the build. So we cannot
- // start to parse while a build is running or we will lose information.
- if (BuildManager::isBuilding(project())) {
- scheduleParsing();
- return;
- }
-
- parseCurrentBuildConfiguration();
+ scheduleParsing();
}
void QbsBuildSystem::delayParsing()
@@ -585,9 +580,18 @@ ExtraCompiler *QbsBuildSystem::findExtraCompiler(const ExtraCompilerFilter &filt
return Utils::findOrDefault(m_extraCompilers, filter);
}
-void QbsBuildSystem::parseCurrentBuildConfiguration()
+void QbsBuildSystem::scheduleParsing()
+{
+ m_parseRequest.reset(new QbsRequest);
+ m_parseRequest->setParseData(this);
+ connect(m_parseRequest.get(), &QbsRequest::done, this, [this] {
+ m_parseRequest.release()->deleteLater();
+ });
+ m_parseRequest->start();
+}
+
+void QbsBuildSystem::startParsing()
{
- m_parsingScheduled = false;
if (m_cancelStatus == CancelStatusCancelingForReparse)
return;
diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h
index 7aa92e1d1b..d694f7dda4 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.h
+++ b/src/plugins/qbsprojectmanager/qbsproject.h
@@ -28,6 +28,7 @@ namespace Internal {
class ErrorInfo;
class QbsBuildConfiguration;
class QbsProjectParser;
+class QbsRequest;
class QbsSession;
class QbsProject : public ProjectExplorer::Project
@@ -88,10 +89,7 @@ public:
static ProjectExplorer::FileType fileTypeFor(const QSet<QString> &tags);
QString profile() const;
- void parseCurrentBuildConfiguration();
- void scheduleParsing() { m_parsingScheduled = true; }
- bool parsingScheduled() const { return m_parsingScheduled; }
- void cancelParsing();
+ void scheduleParsing();
void updateAfterBuild();
QbsSession *session() const { return m_session; }
@@ -103,6 +101,10 @@ public:
private:
friend class QbsProject;
+ friend class QbsRequestObject;
+
+ void startParsing();
+ void cancelParsing();
ProjectExplorer::ExtraCompiler *findExtraCompiler(
const ExtraCompilerFilter &filter) const override;
@@ -133,7 +135,7 @@ private:
using TreeCreationWatcher = QFutureWatcher<QbsProjectNode *>;
TreeCreationWatcher *m_treeCreationWatcher = nullptr;
Utils::Environment m_lastParseEnv;
- bool m_parsingScheduled = false;
+ std::unique_ptr<QbsRequest> m_parseRequest;
enum CancelStatus {
CancelStatusNone,
diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
index 75e5bd24b9..acb6dc45e4 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
+++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
@@ -550,16 +550,8 @@ void QbsProjectManagerPlugin::reparseProject(QbsProject *project)
if (!t)
return;
- QbsBuildSystem *bs = static_cast<QbsBuildSystem *>(t->buildSystem());
- if (!bs)
- return;
-
- // Qbs does update the build graph during the build. So we cannot
- // start to parse while a build is running or we will lose information.
- if (BuildManager::isBuilding(project))
+ if (auto bs = qobject_cast<QbsBuildSystem *>(t->buildSystem()))
bs->scheduleParsing();
- else
- bs->parseCurrentBuildConfiguration();
}
void QbsProjectManagerPlugin::buildNamedProduct(QbsProject *project, const QString &product)
diff --git a/src/plugins/qbsprojectmanager/qbsrequest.cpp b/src/plugins/qbsprojectmanager/qbsrequest.cpp
index 98e4e42f13..1355922b44 100644
--- a/src/plugins/qbsprojectmanager/qbsrequest.cpp
+++ b/src/plugins/qbsprojectmanager/qbsrequest.cpp
@@ -91,6 +91,7 @@ void QbsRequestManager::continueSessionQueue(QbsSession *session)
}
QbsRequestObject *requestObject = queue.first();
connect(requestObject, &QbsRequestObject::done, this, [this, requestObject] {
+ disconnect(requestObject, &QbsRequestObject::done, this, nullptr);
QbsSession *session = requestObject->session();
requestObject->deleteLater();
QList<QbsRequestObject *> &queue = m_queuedRequests[session];
@@ -112,9 +113,11 @@ void QbsRequestObject::start()
{
if (m_parseData) {
connect(m_parseData->target(), &Target::parsingFinished, this, [this](bool success) {
+ disconnect(m_parseData->target(), &Target::parsingFinished, this, nullptr);
emit done(success);
});
- m_parseData->parseCurrentBuildConfiguration();
+ QMetaObject::invokeMethod(m_parseData.get(), &QbsBuildSystem::startParsing,
+ Qt::QueuedConnection);
return;
}