From 0b80c053e4e02e11043e15eaf59da9e4d02d67bb Mon Sep 17 00:00:00 2001
From: Fawzi Mohamed <fawzi.mohamed@digia.com>
Date: Tue, 26 Nov 2013 16:17:06 +0100
Subject: [PATCH] qmljs: avoid double parsing of imports

Change-Id: Ib45a63e3175924158dc2cff60a7b1964f491c375
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
---
 src/plugins/qmljstools/qmljsmodelmanager.cpp | 30 ++++++++++++++------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp
index cb6d6f95a21..dff840d5def 100644
--- a/src/plugins/qmljstools/qmljsmodelmanager.cpp
+++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp
@@ -939,11 +939,15 @@ void ModelManager::importScan(QFutureInterface<void> &future,
 
     QVector<ScanItem> pathsToScan;
     pathsToScan.reserve(paths.size());
-    foreach (const QString &path, paths) {
-        QString cPath = QDir::cleanPath(path);
-        if (modelManager->m_scannedPaths.contains(cPath))
-            continue;
-        pathsToScan.append(ScanItem(cPath));
+    {
+        QMutexLocker l(&modelManager->m_mutex);
+        foreach (const QString &path, paths) {
+            QString cPath = QDir::cleanPath(path);
+            if (modelManager->m_scannedPaths.contains(cPath))
+                continue;
+            pathsToScan.append(ScanItem(cPath));
+            modelManager->m_scannedPaths.insert(cPath);
+        }
     }
     const int maxScanDepth = 5;
     int progressRange = pathsToScan.size() * (1 << (2 + maxScanDepth));
@@ -989,6 +993,12 @@ void ModelManager::importScan(QFutureInterface<void> &future,
         future.setProgressValue(progressRange * workDone / totalWork);
     }
     future.setProgressValue(progressRange);
+    if (future.isCanceled()) {
+        // assume no work has been done
+        QMutexLocker l(&modelManager->m_mutex);
+        foreach (const QString &path, paths)
+            modelManager->m_scannedPaths.remove(path);
+    }
 }
 
 // Check whether fileMimeType is the same or extends knownMimeType
@@ -1104,9 +1114,13 @@ void ModelManager::updateImportPaths()
     updateSourceFiles(importedFiles, true);
 
     QStringList pathToScan;
-    foreach (QString importPath, allImportPaths)
-        if (!m_scannedPaths.contains(importPath))
-            pathToScan.append(importPath);
+    {
+        QMutexLocker l(&m_mutex);
+        foreach (QString importPath, allImportPaths)
+            if (!m_scannedPaths.contains(importPath)) {
+                pathToScan.append(importPath);
+            }
+    }
 
     if (pathToScan.count() > 1) {
         QFuture<void> result = QtConcurrent::run(&ModelManager::importScan,
-- 
GitLab