forked from qt-creator/qt-creator
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:
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user