From 46ffe4f2c7db0c0ae97c170aa61cccadbf454c99 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 19 Sep 2014 12:02:49 +0200 Subject: [PATCH] CppTools: Make CppCurrentDocumentFilter thread safe Change-Id: I6ca4711bad282279c913fe913712ae7b905ab55a Reviewed-by: Eike Ziller --- .../cpptools/cppcurrentdocumentfilter.cpp | 50 +++++++++++-------- .../cpptools/cppcurrentdocumentfilter.h | 10 ++-- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp index d60bc914fe7..9e84280b070 100644 --- a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp +++ b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp @@ -71,25 +71,9 @@ QList CppCurrentDocumentFilter::matchesFor( if (!regexp.isValid()) return goodEntries; bool hasWildcard = (entry.contains(asterisk) || entry.contains(QLatin1Char('?'))); - - if (m_currentFileName.isEmpty()) - return goodEntries; - - if (m_itemsOfCurrentDoc.isEmpty()) { - Snapshot snapshot = m_modelManager->snapshot(); - Document::Ptr thisDocument = snapshot.document(m_currentFileName); - if (thisDocument) { - IndexItem::Ptr rootNode = search(thisDocument); - rootNode->visitAllChildren([&](const IndexItem::Ptr &info) -> IndexItem::VisitorResult { - m_itemsOfCurrentDoc.append(info); - return IndexItem::Recurse; - }); - } - } - const Qt::CaseSensitivity caseSensitivityForPrefix = caseSensitivity(entry); - foreach (IndexItem::Ptr info, m_itemsOfCurrentDoc) { + foreach (IndexItem::Ptr info, itemsOfCurrentDocument()) { if (future.isCanceled()) break; @@ -138,12 +122,14 @@ void CppCurrentDocumentFilter::refresh(QFutureInterface &future) void CppCurrentDocumentFilter::onDocumentUpdated(Document::Ptr doc) { + QMutexLocker locker(&m_mutex); if (m_currentFileName == doc->fileName()) m_itemsOfCurrentDoc.clear(); } -void CppCurrentDocumentFilter::onCurrentEditorChanged(Core::IEditor * currentEditor) +void CppCurrentDocumentFilter::onCurrentEditorChanged(Core::IEditor *currentEditor) { + QMutexLocker locker(&m_mutex); if (currentEditor) m_currentFileName = currentEditor->document()->filePath(); else @@ -151,11 +137,35 @@ void CppCurrentDocumentFilter::onCurrentEditorChanged(Core::IEditor * currentEdi m_itemsOfCurrentDoc.clear(); } -void CppCurrentDocumentFilter::onEditorAboutToClose(Core::IEditor * editorAboutToClose) +void CppCurrentDocumentFilter::onEditorAboutToClose(Core::IEditor *editorAboutToClose) { - if (!editorAboutToClose) return; + if (!editorAboutToClose) + return; + + QMutexLocker locker(&m_mutex); if (m_currentFileName == editorAboutToClose->document()->filePath()) { m_currentFileName.clear(); m_itemsOfCurrentDoc.clear(); } } + +QList CppCurrentDocumentFilter::itemsOfCurrentDocument() +{ + QMutexLocker locker(&m_mutex); + + if (m_currentFileName.isEmpty()) + return QList(); + + if (m_itemsOfCurrentDoc.isEmpty()) { + const Snapshot snapshot = m_modelManager->snapshot(); + if (const Document::Ptr thisDocument = snapshot.document(m_currentFileName)) { + IndexItem::Ptr rootNode = search(thisDocument); + rootNode->visitAllChildren([&](const IndexItem::Ptr &info) -> IndexItem::VisitorResult { + m_itemsOfCurrentDoc.append(info); + return IndexItem::Recurse; + }); + } + } + + return m_itemsOfCurrentDoc; +} diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.h b/src/plugins/cpptools/cppcurrentdocumentfilter.h index 9f2a729d4e8..d14d03db220 100644 --- a/src/plugins/cpptools/cppcurrentdocumentfilter.h +++ b/src/plugins/cpptools/cppcurrentdocumentfilter.h @@ -56,14 +56,18 @@ public: private slots: void onDocumentUpdated(CPlusPlus::Document::Ptr doc); - void onCurrentEditorChanged(Core::IEditor * currentEditor); - void onEditorAboutToClose(Core::IEditor * currentEditor); + void onCurrentEditorChanged(Core::IEditor *currentEditor); + void onEditorAboutToClose(Core::IEditor *currentEditor); private: + QList itemsOfCurrentDocument(); + CppModelManager * m_modelManager; + SearchSymbols search; + + mutable QMutex m_mutex; QString m_currentFileName; QList m_itemsOfCurrentDoc; - SearchSymbols search; }; } // namespace Internal