diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2023-07-31 07:48:20 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2023-07-31 11:12:17 +0000 |
commit | 870cdb12f762545f4d4187d7fccafbfbdac3921b (patch) | |
tree | c93ab0e62ddbffc2840b5d9a07d31d08c83f4468 | |
parent | 1b84828caf029c6296c769787b2c4c7426ef686a (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.cpp | 8 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsproject.cpp | 26 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsproject.h | 12 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp | 10 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsrequest.cpp | 5 |
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; } |