From e8ba82f1f4a8cd337c37ff60d8ef479af9f43fdc Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 2 Jun 2009 15:27:13 +0200
Subject: [PATCH] Protected modelmanager's snapshot.

---
 src/plugins/cpptools/cppmodelmanager.cpp | 12 +++++++++++-
 src/plugins/cpptools/cppmodelmanager.h   |  1 +
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 657286bec53..f807f12bc3b 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -582,6 +582,7 @@ CppModelManager::~CppModelManager()
 
 Snapshot CppModelManager::snapshot() const
 {
+    QMutexLocker locker(&protectSnapshot);
     return m_snapshot;
 }
 
@@ -795,7 +796,11 @@ void CppModelManager::emitDocumentUpdated(Document::Ptr doc)
 void CppModelManager::onDocumentUpdated(Document::Ptr doc)
 {
     const QString fileName = doc->fileName();
-    m_snapshot[fileName] = doc;
+
+    protectSnapshot.lock();
+    m_snapshot.insert(doc);
+    protectSnapshot.unlock();
+
     QList<Core::IEditor *> openedEditors = m_core->editorManager()->openedEditors();
     foreach (Core::IEditor *editor, openedEditors) {
         if (editor->file()->fileName() == fileName) {
@@ -1074,7 +1079,9 @@ void CppModelManager::parse(QFutureInterface<void> &future,
 
 void CppModelManager::GC()
 {
+    protectSnapshot.lock();
     Snapshot documents = m_snapshot;
+    protectSnapshot.unlock();
 
     QSet<QString> processed;
     QStringList todo = projectFiles();
@@ -1105,7 +1112,10 @@ void CppModelManager::GC()
     }
 
     emit aboutToRemoveFiles(removedFiles);
+
+    protectSnapshot.lock();
     m_snapshot = documents;
+    protectSnapshot.unlock();
 }
 
 
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index 30569890e2e..d768d8d50b3 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -170,6 +170,7 @@ private:
     QMap<ProjectExplorer::Project *, ProjectInfo> m_projects;
 
     mutable QMutex mutex;
+    mutable QMutex protectSnapshot;
 
     struct Editor {
         QPointer<TextEditor::ITextEditor> textEditor;
-- 
GitLab