diff options
author | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-11-18 14:43:48 +0100 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-11-19 13:12:00 +0100 |
commit | 3b5e84e650c1c9219766c1edbbd8addb897f389a (patch) | |
tree | 536116df73b806d2a44ca02d6b935c285dbd7260 /src | |
parent | 4c9e3bbecf5af70426ddf9e88cf14cf6bb94cc7d (diff) | |
download | qt-creator-3b5e84e650c1c9219766c1edbbd8addb897f389a.tar.gz |
CppTools: Fix race condition when closing files
If parse() is called in another thread the CppToolsEditorSupport might be
already destructed.
Task-number: QTCREATORBUG-10548
Change-Id: Ie4215937eb1847b51bce8b080aca4925c0bee39f
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/cpptools/cpptoolseditorsupport.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp index ed039bf900..89e787d081 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.cpp +++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp @@ -165,6 +165,7 @@ CppEditorSupport::CppEditorSupport(CppModelManager *modelManager, BaseTextEditor CppEditorSupport::~CppEditorSupport() { + m_documentParser.cancel(); m_highlighter.cancel(); m_futureSemanticInfo.cancel(); @@ -278,13 +279,15 @@ void CppEditorSupport::updateDocument() m_updateDocumentTimer->start(m_updateDocumentInterval); } -static void parse(QFutureInterface<void> &future, CppEditorSupport *support) +static void parse(QFutureInterface<void> &future, QSharedPointer<SnapshotUpdater> updater) { future.setProgressRange(0, 1); + if (future.isCanceled()) { + future.setProgressValue(1); + return; + } CppModelManager *cmm = qobject_cast<CppModelManager *>(CppModelManager::instance()); - QSharedPointer<SnapshotUpdater> updater = support->snapshotUpdater(); - updater->update(cmm->workingCopy()); cmm->finishedRefreshingSourceFiles(QStringList(updater->fileInEditor())); @@ -304,7 +307,7 @@ void CppEditorSupport::updateDocumentNow() if (m_highlightingSupport && !m_highlightingSupport->requiresSemanticInfo()) startHighlighting(); - m_documentParser = QtConcurrent::run(&parse, this); + m_documentParser = QtConcurrent::run(&parse, snapshotUpdater()); } } |