From e7904caf0b1c3fe4fe88e275286c0da326e1e2cf Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 8 Apr 2014 12:26:52 -0400 Subject: [PATCH] CppTools: Do not wait in GUI thread for the parsed document ...when collecting data for the semantic highlighting recalculation. Task-number: QTCREATORBUG-11037 Change-Id: Ibed73a2916df0a91aedef166de2c8c6bb5df309c Reviewed-by: Orgad Shaneh Reviewed-by: Erik Verbruggen --- .../cpptools/cpptoolseditorsupport.cpp | 30 ++++++++++++++----- src/plugins/cpptools/cpptoolseditorsupport.h | 4 +++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp index e2c33c8dda..4f1adb8a25 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.cpp +++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp @@ -261,10 +261,10 @@ CppCompletionAssistProvider *CppEditorSupport::completionAssistProvider() const QSharedPointer CppEditorSupport::snapshotUpdater() { - QSharedPointer updater = m_snapshotUpdater; + QSharedPointer updater = snapshotUpdater_internal(); if (!updater || updater->fileInEditor() != fileName()) { updater = QSharedPointer(new SnapshotUpdater(fileName())); - m_snapshotUpdater = updater; + setSnapshotUpdater_internal(updater); QSharedPointer cms = CppToolsPlugin::instance()->codeModelSettings(); updater->setUsePrecompiledHeaders(cms->pchUsage() != CppCodeModelSettings::PchUse_None); @@ -518,14 +518,12 @@ SemanticInfo::Source CppEditorSupport::currentSource(bool force) int line = 0, column = 0; m_textEditor->convertPosition(m_textEditor->editorWidget()->position(), &line, &column); - const Snapshot snapshot = snapshotUpdater()->snapshot(); - QByteArray code; if (force || m_lastSemanticInfo.revision != editorRevision()) code = contents(); // get the source code only when needed. const unsigned revision = editorRevision(); - SemanticInfo::Source source(snapshot, fileName(), code, line, column, revision, force); + SemanticInfo::Source source(Snapshot(), fileName(), code, line, column, revision, force); return source; } @@ -552,9 +550,13 @@ void CppEditorSupport::recalculateSemanticInfoNow(const SemanticInfo::Source &so } if (semanticInfo.doc.isNull()) { - semanticInfo.snapshot = source.snapshot; - if (source.snapshot.contains(source.fileName)) { - Document::Ptr doc = source.snapshot.preprocessedDocument(source.code, source.fileName); + const QSharedPointer snapshotUpdater = snapshotUpdater_internal(); + QTC_ASSERT(snapshotUpdater, return); + semanticInfo.snapshot = snapshotUpdater->snapshot(); + + if (semanticInfo.snapshot.contains(source.fileName)) { + Document::Ptr doc = semanticInfo.snapshot.preprocessedDocument(source.code, + source.fileName); if (processor) doc->control()->setTopLevelDeclarationProcessor(processor); doc->check(); @@ -593,6 +595,18 @@ void CppEditorSupport::recalculateSemanticInfoDetached_helper(QFutureInterface CppEditorSupport::snapshotUpdater_internal() const +{ + QMutexLocker locker(&m_snapshotUpdaterLock); + return m_snapshotUpdater; +} + +void CppEditorSupport::setSnapshotUpdater_internal(const QSharedPointer &updater) +{ + QMutexLocker locker(&m_snapshotUpdaterLock); + m_snapshotUpdater = updater; +} + void CppEditorSupport::onMimeTypeChanged() { m_highlighter.cancel(); diff --git a/src/plugins/cpptools/cpptoolseditorsupport.h b/src/plugins/cpptools/cpptoolseditorsupport.h index 29cfb508e0..f452304bfb 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.h +++ b/src/plugins/cpptools/cpptoolseditorsupport.h @@ -197,6 +197,9 @@ private: void recalculateSemanticInfoDetached_helper(QFutureInterface &future, SemanticInfo::Source source); + QSharedPointer snapshotUpdater_internal() const; + void setSnapshotUpdater_internal(const QSharedPointer &updater); + private: Internal::CppModelManager *m_modelManager; QPointer m_textEditor; @@ -225,6 +228,7 @@ private: mutable QMutex m_lastSemanticInfoLock; SemanticInfo m_lastSemanticInfo; QFuture m_futureSemanticInfo; + mutable QMutex m_snapshotUpdaterLock; QSharedPointer m_snapshotUpdater; // Highlighting: -- GitLab