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:
Jarek Kobus
2021-05-04 17:44:23 +02:00
parent b3a893e9b8
commit 0ca487b265
2 changed files with 5 additions and 3 deletions

View File

@@ -91,15 +91,14 @@ ClangEditorDocumentProcessor::ClangEditorDocumentProcessor(
this, &ClangEditorDocumentProcessor::cppDocumentUpdated); this, &ClangEditorDocumentProcessor::cppDocumentUpdated);
connect(&m_builtinProcessor, &CppTools::BuiltinEditorDocumentProcessor::semanticInfoUpdated, connect(&m_builtinProcessor, &CppTools::BuiltinEditorDocumentProcessor::semanticInfoUpdated,
this, &ClangEditorDocumentProcessor::semanticInfoUpdated); this, &ClangEditorDocumentProcessor::semanticInfoUpdated);
m_parserSynchronizer.setCancelOnWait(true);
} }
ClangEditorDocumentProcessor::~ClangEditorDocumentProcessor() ClangEditorDocumentProcessor::~ClangEditorDocumentProcessor()
{ {
m_updateBackendDocumentTimer.stop(); m_updateBackendDocumentTimer.stop();
m_parserWatcher.cancel();
m_parserWatcher.waitForFinished();
if (m_projectPart) if (m_projectPart)
closeBackendDocument(); closeBackendDocument();
} }
@@ -120,6 +119,7 @@ void ClangEditorDocumentProcessor::runImpl(
this, &ClangEditorDocumentProcessor::onParserFinished); this, &ClangEditorDocumentProcessor::onParserFinished);
const QFuture<void> future = ::Utils::runAsync(&runParser, parser(), updateParams); const QFuture<void> future = ::Utils::runAsync(&runParser, parser(), updateParams);
m_parserWatcher.setFuture(future); m_parserWatcher.setFuture(future);
m_parserSynchronizer.addFuture(future);
// Run builtin processor // Run builtin processor
m_builtinProcessor.runImpl(updateParams); m_builtinProcessor.runImpl(updateParams);

View File

@@ -33,6 +33,7 @@
#include <utils/id.h> #include <utils/id.h>
#include <QFutureSynchronizer>
#include <QFutureWatcher> #include <QFutureWatcher>
#include <QTimer> #include <QTimer>
@@ -145,6 +146,7 @@ private:
QVector<ClangBackEnd::TokenInfoContainer> m_tokenInfos; QVector<ClangBackEnd::TokenInfoContainer> m_tokenInfos;
CppTools::SemanticHighlighter m_semanticHighlighter; CppTools::SemanticHighlighter m_semanticHighlighter;
CppTools::BuiltinEditorDocumentProcessor m_builtinProcessor; CppTools::BuiltinEditorDocumentProcessor m_builtinProcessor;
QFutureSynchronizer<void> m_parserSynchronizer;
}; };
} // namespace Internal } // namespace Internal