From ab13b7b155b4e4dd61cdaa564ffb9d6661ead53e Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 6 Oct 2023 10:25:31 +0200 Subject: [PATCH] HelpManager: Hide registerDocumentationNow() in cpp This avoid calling collectionFilePath() concurrently, which might be potentially problematic. Change-Id: Ic873b6429b933f2f3359623b1e9cb14409ef3c4b Reviewed-by: Eike Ziller --- src/plugins/help/helpmanager.cpp | 67 ++++++++++++++++---------------- src/plugins/help/helpmanager.h | 1 - 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/plugins/help/helpmanager.cpp b/src/plugins/help/helpmanager.cpp index f971f825689..5aaa98651e1 100644 --- a/src/plugins/help/helpmanager.cpp +++ b/src/plugins/help/helpmanager.cpp @@ -94,6 +94,39 @@ QString HelpManager::collectionFilePath() return ICore::userResourcePath("helpcollection.qhc").toString(); } +static void registerDocumentationNow(QPromise &promise, const QString &collectionFilePath, + const QStringList &files) +{ + QMutexLocker locker(&d->m_helpengineMutex); + + promise.setProgressRange(0, files.count()); + promise.setProgressValue(0); + + QHelpEngineCore helpEngine(collectionFilePath); + helpEngine.setReadOnly(false); + helpEngine.setupData(); + bool docsChanged = false; + QStringList nameSpaces = helpEngine.registeredDocumentations(); + for (const QString &file : files) { + if (promise.isCanceled()) + break; + promise.setProgressValue(promise.future().progressValue() + 1); + const QString &nameSpace = QHelpEngineCore::namespaceName(file); + if (nameSpace.isEmpty()) + continue; + if (!nameSpaces.contains(nameSpace)) { + if (helpEngine.registerDocumentation(file)) { + nameSpaces.append(nameSpace); + docsChanged = true; + } else { + qWarning() << "Error registering namespace '" << nameSpace + << "' from file '" << file << "':" << helpEngine.error(); + } + } + } + promise.addResult(docsChanged); +} + void HelpManager::registerDocumentation(const QStringList &files) { if (d->m_needsSetup) { @@ -102,7 +135,7 @@ void HelpManager::registerDocumentation(const QStringList &files) return; } - QFuture future = Utils::asyncRun(&HelpManager::registerDocumentationNow, files); + QFuture future = Utils::asyncRun(registerDocumentationNow, collectionFilePath(), files); Utils::onResultReady(future, this, [](bool docsChanged){ if (docsChanged) { d->m_helpEngine->setupData(); @@ -125,38 +158,6 @@ void HelpManager::unregisterDocumentation(const QStringList &fileNames) unregisterNamespaces(getNamespaces(fileNames)); } -void HelpManager::registerDocumentationNow(QPromise &promise, const QStringList &files) -{ - QMutexLocker locker(&d->m_helpengineMutex); - - promise.setProgressRange(0, files.count()); - promise.setProgressValue(0); - - QHelpEngineCore helpEngine(collectionFilePath()); - helpEngine.setReadOnly(false); - helpEngine.setupData(); - bool docsChanged = false; - QStringList nameSpaces = helpEngine.registeredDocumentations(); - for (const QString &file : files) { - if (promise.isCanceled()) - break; - promise.setProgressValue(promise.future().progressValue() + 1); - const QString &nameSpace = QHelpEngineCore::namespaceName(file); - if (nameSpace.isEmpty()) - continue; - if (!nameSpaces.contains(nameSpace)) { - if (helpEngine.registerDocumentation(file)) { - nameSpaces.append(nameSpace); - docsChanged = true; - } else { - qWarning() << "Error registering namespace '" << nameSpace - << "' from file '" << file << "':" << helpEngine.error(); - } - } - } - promise.addResult(docsChanged); -} - void HelpManager::unregisterNamespaces(const QStringList &nameSpaces) { if (d->m_needsSetup) { diff --git a/src/plugins/help/helpmanager.h b/src/plugins/help/helpmanager.h index 739d5a68767..0e2d1fbd5a1 100644 --- a/src/plugins/help/helpmanager.h +++ b/src/plugins/help/helpmanager.h @@ -59,7 +59,6 @@ public: Core::HelpManager::HelpViewerLocation location = Core::HelpManager::HelpModeAlways) override; static void setupHelpManager(); - static void registerDocumentationNow(QPromise &promise, const QStringList &fileNames); signals: void collectionFileChanged();