From 3e440ec21395fd8b128ba521b476a925d84e9408 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 10 May 2010 09:54:30 +0200
Subject: [PATCH] Cache the resolved file names.

---
 src/plugins/cpptools/cppmodelmanager.cpp | 28 +++++++++++++++++++-----
 src/plugins/cpptools/cppmodelmanager.h   |  2 ++
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index a88742112e7..f4be14c6b0c 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -397,6 +397,28 @@ bool CppPreprocessor::includeFile(const QString &absoluteFilePath, QString *resu
 }
 
 QString CppPreprocessor::tryIncludeFile(QString &fileName, IncludeType type, unsigned *revision)
+{
+    if (type == IncludeGlobal) {
+        const QString fn = m_fileNameCache.value(fileName);
+
+        if (! fn.isEmpty()) {
+            fileName = fn;
+
+            if (revision)
+                *revision = 0;
+
+            return QString();
+        }
+    }
+
+    const QString originalFileName = fileName;
+    const QString contents = tryIncludeFile_helper(fileName, type, revision);
+    if (type == IncludeGlobal)
+        m_fileNameCache.insert(originalFileName, fileName);
+    return contents;
+}
+
+QString CppPreprocessor::tryIncludeFile_helper(QString &fileName, IncludeType type, unsigned *revision)
 {
     QFileInfo fileInfo(fileName);
     if (fileName == QLatin1String(pp_configuration_file) || fileInfo.isAbsolute()) {
@@ -1375,9 +1397,6 @@ void CppModelManager::parse(QFutureInterface<void> &future,
         if (future.isCanceled())
             break;
 
-        // Change the priority of the background parser thread to idle.
-        QThread::currentThread()->setPriority(QThread::IdlePriority);
-
         const QString fileName = files.at(i);
 
         const bool isSourceFile = i < sourceCount;
@@ -1396,9 +1415,6 @@ void CppModelManager::parse(QFutureInterface<void> &future,
 
         if (isSourceFile)
             preproc->resetEnvironment();
-
-        // Restore the previous thread priority.
-        QThread::currentThread()->setPriority(QThread::NormalPriority);
     }
 
     future.setProgressValue(files.size());
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index 2e6651cb12e..1ba6d71efdb 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -270,6 +270,7 @@ protected:
 
     bool includeFile(const QString &absoluteFilePath, QString *result, unsigned *revision);
     QString tryIncludeFile(QString &fileName, IncludeType type, unsigned *revision);
+    QString tryIncludeFile_helper(QString &fileName, IncludeType type, unsigned *revision);
 
     void mergeEnvironment(CPlusPlus::Document::Ptr doc);
 
@@ -303,6 +304,7 @@ private:
     QSet<QString> m_todo;
     QSet<QString> m_processed;
     unsigned m_revision;
+    QHash<QString, QString> m_fileNameCache;
 };
 
 } // namespace Internal
-- 
GitLab