forked from qt-creator/qt-creator
Fix a possible crash in ClangEditorDocumentProcessor
Use QFutureSynchronizer in order to ensure that all threads have finished on shutdown. Fixes: QTCREATORBUG-25673 Change-Id: I3a6a808ada389bc51a1f0149dfc112768929a20d Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -91,15 +91,14 @@ ClangEditorDocumentProcessor::ClangEditorDocumentProcessor(
|
||||
this, &ClangEditorDocumentProcessor::cppDocumentUpdated);
|
||||
connect(&m_builtinProcessor, &CppTools::BuiltinEditorDocumentProcessor::semanticInfoUpdated,
|
||||
this, &ClangEditorDocumentProcessor::semanticInfoUpdated);
|
||||
|
||||
m_parserSynchronizer.setCancelOnWait(true);
|
||||
}
|
||||
|
||||
ClangEditorDocumentProcessor::~ClangEditorDocumentProcessor()
|
||||
{
|
||||
m_updateBackendDocumentTimer.stop();
|
||||
|
||||
m_parserWatcher.cancel();
|
||||
m_parserWatcher.waitForFinished();
|
||||
|
||||
if (m_projectPart)
|
||||
closeBackendDocument();
|
||||
}
|
||||
@@ -120,6 +119,7 @@ void ClangEditorDocumentProcessor::runImpl(
|
||||
this, &ClangEditorDocumentProcessor::onParserFinished);
|
||||
const QFuture<void> future = ::Utils::runAsync(&runParser, parser(), updateParams);
|
||||
m_parserWatcher.setFuture(future);
|
||||
m_parserSynchronizer.addFuture(future);
|
||||
|
||||
// Run builtin processor
|
||||
m_builtinProcessor.runImpl(updateParams);
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
|
||||
#include <utils/id.h>
|
||||
|
||||
#include <QFutureSynchronizer>
|
||||
#include <QFutureWatcher>
|
||||
#include <QTimer>
|
||||
|
||||
@@ -145,6 +146,7 @@ private:
|
||||
QVector<ClangBackEnd::TokenInfoContainer> m_tokenInfos;
|
||||
CppTools::SemanticHighlighter m_semanticHighlighter;
|
||||
CppTools::BuiltinEditorDocumentProcessor m_builtinProcessor;
|
||||
QFutureSynchronizer<void> m_parserSynchronizer;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
Reference in New Issue
Block a user