From cb5977fbad51d035d05f441e78204f591a5a916f Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 9 Feb 2021 15:37:06 +0100 Subject: [PATCH] Stop executing locator's threads when about to shutdown occurred Mark that about to shutdown has occurred and don't start any new thread after that. Fixes: QTCREATORBUG-25318 Change-Id: I14d47c93dd8e8a82f6f68264a03d5831ec95da75 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/coreplugin.cpp | 1 + src/plugins/coreplugin/locator/locator.cpp | 10 ++++++++++ src/plugins/coreplugin/locator/locator.h | 2 ++ src/plugins/coreplugin/locator/locatorwidget.cpp | 10 ++++++++++ src/plugins/coreplugin/locator/locatorwidget.h | 1 + 5 files changed, 24 insertions(+) diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 59b008855e4..a98eaa65a3c 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -443,6 +443,7 @@ QString CorePlugin::msgCrashpadInformation() ExtensionSystem::IPlugin::ShutdownFlag CorePlugin::aboutToShutdown() { Find::aboutToShutdown(); + m_locator->aboutToShutdown(); m_mainWindow->aboutToShutdown(); return SynchronousShutdown; } diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index 7bf290612e2..cc1ac31fb70 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -169,6 +169,16 @@ bool Locator::delayedInitialize() return true; } +void Locator::aboutToShutdown() +{ + m_refreshTimer.stop(); + if (m_refreshTask.isRunning()) { + m_refreshTask.cancel(); + m_refreshTask.waitForFinished(); + } + emit aboutToShutdownOccurred(); +} + void Locator::loadSettings() { SettingsDatabase *settings = ICore::settingsDatabase(); diff --git a/src/plugins/coreplugin/locator/locator.h b/src/plugins/coreplugin/locator/locator.h index ea74e90df8b..26e577eb7fb 100644 --- a/src/plugins/coreplugin/locator/locator.h +++ b/src/plugins/coreplugin/locator/locator.h @@ -48,6 +48,7 @@ public: ~Locator() override; static Locator *instance(); + void aboutToShutdown(); void initialize(); void extensionsInitialized(); @@ -62,6 +63,7 @@ public: signals: void filtersChanged(); + void aboutToShutdownOccurred(); public slots: void refresh(QList filters); diff --git a/src/plugins/coreplugin/locator/locatorwidget.cpp b/src/plugins/coreplugin/locator/locatorwidget.cpp index d88bc210adb..2d0f546f108 100644 --- a/src/plugins/coreplugin/locator/locatorwidget.cpp +++ b/src/plugins/coreplugin/locator/locatorwidget.cpp @@ -616,6 +616,13 @@ LocatorWidget::LocatorWidget(Locator *locator) : connect(qApp, &QApplication::focusChanged, this, &LocatorWidget::updatePreviousFocusWidget); connect(locator, &Locator::filtersChanged, this, &LocatorWidget::updateFilterList); + connect(locator, &Locator::aboutToShutdownOccurred, this, [this]() { + m_shuttingDown = true; + if (m_entriesWatcher->isRunning()) { + m_entriesWatcher->cancel(); + m_entriesWatcher->waitForFinished(); + } + }); updateFilterList(); } @@ -828,6 +835,9 @@ void LocatorWidget::setProgressIndicatorVisible(bool visible) void LocatorWidget::updateCompletionList(const QString &text) { + if (m_shuttingDown) + return; + m_updateRequested = true; if (m_entriesWatcher->future().isRunning()) { // Cancel the old future. We may not just block the UI thread to wait for the search to diff --git a/src/plugins/coreplugin/locator/locatorwidget.h b/src/plugins/coreplugin/locator/locatorwidget.h index 99b4afdee5d..5fa538ec0b7 100644 --- a/src/plugins/coreplugin/locator/locatorwidget.h +++ b/src/plugins/coreplugin/locator/locatorwidget.h @@ -98,6 +98,7 @@ private: QTimer m_showPopupTimer; QFutureWatcher *m_entriesWatcher = nullptr; QString m_requestedCompletionText; + bool m_shuttingDown = false; bool m_needsClearResult = true; bool m_updateRequested = false; bool m_possibleToolTipRequest = false;