From 0ca487b265160549dc0a445b4e74d68033ec4c1c Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 4 May 2021 17:44:23 +0200 Subject: [PATCH] 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 --- src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp | 6 +++--- src/plugins/clangcodemodel/clangeditordocumentprocessor.h | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index b282e754eb5..58eae03422d 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -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 future = ::Utils::runAsync(&runParser, parser(), updateParams); m_parserWatcher.setFuture(future); + m_parserSynchronizer.addFuture(future); // Run builtin processor m_builtinProcessor.runImpl(updateParams); diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index 91d98601aab..0d3e23c02b2 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -33,6 +33,7 @@ #include +#include #include #include @@ -145,6 +146,7 @@ private: QVector m_tokenInfos; CppTools::SemanticHighlighter m_semanticHighlighter; CppTools::BuiltinEditorDocumentProcessor m_builtinProcessor; + QFutureSynchronizer m_parserSynchronizer; }; } // namespace Internal