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);
|
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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user