Fix a possible crash in FindReferences on shutdown

Cancel and wait for all threads started by FindReferences
in its destructor.

Task-number: QTCREATORBUG-25711
Change-Id: I83c3ea832a173a7fff5c52e0c0136dfff2234afe
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Jarek Kobus
2021-05-11 09:26:15 +02:00
parent c4236da9d1
commit 492f13578e
2 changed files with 6 additions and 0 deletions

View File

@@ -815,6 +815,7 @@ FindReferences::FindReferences(QObject *parent)
m_watcher.setPendingResultsLimit(1); m_watcher.setPendingResultsLimit(1);
connect(&m_watcher, &QFutureWatcherBase::resultsReadyAt, this, &FindReferences::displayResults); connect(&m_watcher, &QFutureWatcherBase::resultsReadyAt, this, &FindReferences::displayResults);
connect(&m_watcher, &QFutureWatcherBase::finished, this, &FindReferences::searchFinished); connect(&m_watcher, &QFutureWatcherBase::finished, this, &FindReferences::searchFinished);
m_synchronizer.setCancelOnWait(true);
} }
FindReferences::~FindReferences() = default; FindReferences::~FindReferences() = default;
@@ -922,6 +923,7 @@ void FindReferences::findUsages(const QString &fileName, quint32 offset)
QFuture<Usage> result = Utils::runAsync(&find_helper, ModelManagerInterface::workingCopy(), QFuture<Usage> result = Utils::runAsync(&find_helper, ModelManagerInterface::workingCopy(),
modelManager->snapshot(), fileName, offset, QString()); modelManager->snapshot(), fileName, offset, QString());
m_watcher.setFuture(result); m_watcher.setFuture(result);
m_synchronizer.addFuture(result);
} }
void FindReferences::renameUsages(const QString &fileName, quint32 offset, void FindReferences::renameUsages(const QString &fileName, quint32 offset,
@@ -937,6 +939,7 @@ void FindReferences::renameUsages(const QString &fileName, quint32 offset,
QFuture<Usage> result = Utils::runAsync(&find_helper, ModelManagerInterface::workingCopy(), QFuture<Usage> result = Utils::runAsync(&find_helper, ModelManagerInterface::workingCopy(),
modelManager->snapshot(), fileName, offset, newName); modelManager->snapshot(), fileName, offset, newName);
m_watcher.setFuture(result); m_watcher.setFuture(result);
m_synchronizer.addFuture(result);
} }
QList<FindReferences::Usage> FindReferences::findUsageOfType(const QString &fileName, const QString &typeName) QList<FindReferences::Usage> FindReferences::findUsageOfType(const QString &fileName, const QString &typeName)

View File

@@ -27,6 +27,8 @@
#include "qmljseditor_global.h" #include "qmljseditor_global.h"
#include <utils/futuresynchronizer.h>
#include <QObject> #include <QObject>
#include <QFutureWatcher> #include <QFutureWatcher>
#include <QPointer> #include <QPointer>
@@ -81,6 +83,7 @@ private:
QPointer<Core::SearchResult> m_currentSearch; QPointer<Core::SearchResult> m_currentSearch;
QFutureWatcher<Usage> m_watcher; QFutureWatcher<Usage> m_watcher;
Utils::FutureSynchronizer m_synchronizer;
}; };
} // namespace QmlJSEditor } // namespace QmlJSEditor