Core: cancel async documentation registration on shutdown

Change-Id: I46bc81cf6326e964309996e0e205fff011f596e7
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2018-02-21 08:41:36 +01:00
committed by Christian Stenger
parent 075d636655
commit 63cc5491f5
3 changed files with 17 additions and 3 deletions

View File

@@ -275,5 +275,6 @@ ExtensionSystem::IPlugin::ShutdownFlag CorePlugin::aboutToShutdown()
{ {
Find::aboutToShutdown(); Find::aboutToShutdown();
m_mainWindow->aboutToShutdown(); m_mainWindow->aboutToShutdown();
HelpManager::aboutToShutdown();
return SynchronousShutdown; return SynchronousShutdown;
} }

View File

@@ -79,7 +79,8 @@ struct HelpManagerPrivate
QSet<QString> m_userRegisteredFiles; QSet<QString> m_userRegisteredFiles;
QMutex helpengineMutex; QMutex m_helpengineMutex;
QFuture<bool> m_registerFuture;
}; };
static HelpManager *m_instance = nullptr; static HelpManager *m_instance = nullptr;
@@ -149,7 +150,7 @@ void HelpManager::registerDocumentation(const QStringList &files)
void HelpManager::registerDocumentationNow(QFutureInterface<bool> &futureInterface, void HelpManager::registerDocumentationNow(QFutureInterface<bool> &futureInterface,
const QStringList &files) const QStringList &files)
{ {
QMutexLocker locker(&d->helpengineMutex); QMutexLocker locker(&d->m_helpengineMutex);
futureInterface.setProgressRange(0, files.count()); futureInterface.setProgressRange(0, files.count());
futureInterface.setProgressValue(0); futureInterface.setProgressValue(0);
@@ -157,6 +158,8 @@ void HelpManager::registerDocumentationNow(QFutureInterface<bool> &futureInterfa
QHelpEngineCore helpEngine(collectionFilePath()); QHelpEngineCore helpEngine(collectionFilePath());
bool docsChanged = false; bool docsChanged = false;
for (const QString &file : files) { for (const QString &file : files) {
if (futureInterface.isCanceled())
break;
futureInterface.setProgressValue(futureInterface.progressValue() + 1); futureInterface.setProgressValue(futureInterface.progressValue() + 1);
const QString &nameSpace = helpEngine.namespaceName(file); const QString &nameSpace = helpEngine.namespaceName(file);
if (nameSpace.isEmpty()) if (nameSpace.isEmpty())
@@ -193,7 +196,7 @@ void HelpManager::unregisterDocumentation(const QStringList &nameSpaces)
return; return;
} }
QMutexLocker locker(&d->helpengineMutex); QMutexLocker locker(&d->m_helpengineMutex);
bool docsChanged = false; bool docsChanged = false;
for (const QString &nameSpace : nameSpaces) { for (const QString &nameSpace : nameSpaces) {
const QString filePath = d->m_helpEngine->documentationFileName(nameSpace); const QString filePath = d->m_helpEngine->documentationFileName(nameSpace);
@@ -396,6 +399,14 @@ void HelpManager::addUserDefinedFilter(const QString &filter, const QStringList
emit m_instance->collectionFileChanged(); emit m_instance->collectionFileChanged();
} }
void HelpManager::aboutToShutdown()
{
if (d && d->m_registerFuture.isRunning()) {
d->m_registerFuture.cancel();
d->m_registerFuture.waitForFinished();
}
}
// -- private // -- private
void HelpManager::setupHelpManager() void HelpManager::setupHelpManager()

View File

@@ -87,6 +87,8 @@ public:
static void removeUserDefinedFilter(const QString &filter); static void removeUserDefinedFilter(const QString &filter);
static void addUserDefinedFilter(const QString &filter, const QStringList &attr); static void addUserDefinedFilter(const QString &filter, const QStringList &attr);
static void aboutToShutdown();
public slots: public slots:
static void handleHelpRequest(const QUrl &url, static void handleHelpRequest(const QUrl &url,
Core::HelpManager::HelpViewerLocation location = HelpModeAlways); Core::HelpManager::HelpViewerLocation location = HelpModeAlways);