aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2014-09-19 12:02:49 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2014-09-22 10:58:27 +0200
commit46ffe4f2c7db0c0ae97c170aa61cccadbf454c99 (patch)
tree9ebb50fd642de94794a04e5b6ad9a17cbf9bb478 /src/plugins/cpptools/cppcurrentdocumentfilter.cpp
parent1bcb9f4934e35b9176ab1d97bf6c0798d64640ef (diff)
CppTools: Make CppCurrentDocumentFilter thread safe
Change-Id: I6ca4711bad282279c913fe913712ae7b905ab55a Reviewed-by: Eike Ziller <eike.ziller@digia.com>
Diffstat (limited to 'src/plugins/cpptools/cppcurrentdocumentfilter.cpp')
-rw-r--r--src/plugins/cpptools/cppcurrentdocumentfilter.cpp50
1 files changed, 30 insertions, 20 deletions
diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
index d60bc914fe..9e84280b07 100644
--- a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
+++ b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
@@ -71,25 +71,9 @@ QList<Core::LocatorFilterEntry> 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<void> &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<CppTools::IndexItem::Ptr> CppCurrentDocumentFilter::itemsOfCurrentDocument()
+{
+ QMutexLocker locker(&m_mutex);
+
+ if (m_currentFileName.isEmpty())
+ return QList<CppTools::IndexItem::Ptr>();
+
+ 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;
+}