From 9dcb65a3dc6df6d0a0e94fba6c1c334ec7ee6b79 Mon Sep 17 00:00:00 2001
From: Eike Ziller <eike.ziller@nokia.com>
Date: Mon, 30 Jan 2012 16:15:32 +0100
Subject: [PATCH] Delay autodetection of the tool chains to a point where it's
 needed.

Change-Id: Ic05b2ec842be1486203c3d9e6e0fc28f1fcf91b4
Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
Reviewed-by: hjk <qthjk@ovi.com>
---
 .../projectexplorer/projectexplorer.cpp       |  2 -
 .../projectexplorer/toolchainmanager.cpp      | 48 ++++++++++++++-----
 .../projectexplorer/toolchainmanager.h        |  4 +-
 3 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 8eac7f4403d..427dda7ab25 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1108,8 +1108,6 @@ void ProjectExplorerPlugin::clearSession()
 
 void ProjectExplorerPlugin::extensionsInitialized()
 {
-    d->m_toolChainManager->restoreToolChains();
-
     d->m_proWindow->extensionsInitialized();
     d->m_fileFactories = ProjectFileFactory::createFactories(&d->m_projectFilterString);
     foreach (ProjectFileFactory *pf, d->m_fileFactories) {
diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp
index 7e334290bcf..da53306bbd2 100644
--- a/src/plugins/projectexplorer/toolchainmanager.cpp
+++ b/src/plugins/projectexplorer/toolchainmanager.cpp
@@ -76,10 +76,32 @@ namespace Internal {
 class ToolChainManagerPrivate
 {
 public:
-    QList<ToolChain *> m_toolChains;
+    ToolChainManagerPrivate(ToolChainManager *parent);
+
+    QList<ToolChain *> &toolChains();
+
+    ToolChainManager *q;
+    bool m_initialized;
     QMap<QString, Utils::FileName> m_abiToDebugger;
+
+private:
+    QList<ToolChain *> m_toolChains;
 };
 
+ToolChainManagerPrivate::ToolChainManagerPrivate(ToolChainManager *parent)
+    : q(parent), m_initialized(false)
+{
+}
+
+QList<ToolChain *> &ToolChainManagerPrivate::toolChains()
+{
+    if (!m_initialized) {
+        m_initialized = true;
+        q->restoreToolChains();
+    }
+    return m_toolChains;
+}
+
 } // namespace Internal
 
 // --------------------------------------------------------------------------
@@ -94,7 +116,7 @@ ToolChainManager *ToolChainManager::instance()
 
 ToolChainManager::ToolChainManager(QObject *parent) :
     QObject(parent),
-    d(new Internal::ToolChainManagerPrivate)
+    d(new Internal::ToolChainManagerPrivate(this))
 {
     Q_ASSERT(!m_instance);
     m_instance = this;
@@ -170,7 +192,7 @@ void ToolChainManager::restoreToolChains()
 ToolChainManager::~ToolChainManager()
 {
     // Deregister tool chains
-    QList<ToolChain *> copy = d->m_toolChains;
+    QList<ToolChain *> copy = d->toolChains();
     foreach (ToolChain *tc, copy)
         deregisterToolChain(tc);
 
@@ -184,7 +206,7 @@ void ToolChainManager::saveToolChains()
     writer.saveValue(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 1);
 
     int count = 0;
-    foreach (ToolChain *tc, d->m_toolChains) {
+    foreach (ToolChain *tc, d->toolChains()) {
         if (tc->isValid()) {
             QVariantMap tmp = tc->toMap();
             if (tmp.isEmpty())
@@ -257,13 +279,13 @@ QList<ToolChain *> ToolChainManager::restoreToolChains(const QString &fileName)
 
 QList<ToolChain *> ToolChainManager::toolChains() const
 {
-    return d->m_toolChains;
+    return d->toolChains();
 }
 
 QList<ToolChain *> ToolChainManager::findToolChains(const Abi &abi) const
 {
     QList<ToolChain *> result;
-    foreach (ToolChain *tc, d->m_toolChains) {
+    foreach (ToolChain *tc, toolChains()) {
         Abi targetAbi = tc->targetAbi();
         if (targetAbi.isCompatibleWith(abi))
             result.append(tc);
@@ -276,7 +298,7 @@ ToolChain *ToolChainManager::findToolChain(const QString &id) const
     if (id.isEmpty())
         return 0;
 
-    foreach (ToolChain *tc, d->m_toolChains) {
+    foreach (ToolChain *tc, d->toolChains()) {
         if (tc->id() == id || (!tc->legacyId().isEmpty() && tc->legacyId() == id))
             return tc;
     }
@@ -290,30 +312,30 @@ Utils::FileName ToolChainManager::defaultDebugger(const Abi &abi) const
 
 void ToolChainManager::notifyAboutUpdate(ProjectExplorer::ToolChain *tc)
 {
-    if (!tc || !d->m_toolChains.contains(tc))
+    if (!tc || !toolChains().contains(tc))
         return;
     emit toolChainUpdated(tc);
 }
 
 bool ToolChainManager::registerToolChain(ToolChain *tc)
 {
-    if (!tc || d->m_toolChains.contains(tc))
+    if (!tc || d->toolChains().contains(tc))
         return true;
-    foreach (ToolChain *current, d->m_toolChains) {
+    foreach (ToolChain *current, d->toolChains()) {
         if (*tc == *current)
             return false;
     }
 
-    d->m_toolChains.append(tc);
+    d->toolChains().append(tc);
     emit toolChainAdded(tc);
     return true;
 }
 
 void ToolChainManager::deregisterToolChain(ToolChain *tc)
 {
-    if (!tc || !d->m_toolChains.contains(tc))
+    if (!tc || !d->toolChains().contains(tc))
         return;
-    d->m_toolChains.removeOne(tc);
+    d->toolChains().removeOne(tc);
     emit toolChainRemoved(tc);
     delete tc;
 }
diff --git a/src/plugins/projectexplorer/toolchainmanager.h b/src/plugins/projectexplorer/toolchainmanager.h
index 31ab664e627..3fd3e351d46 100644
--- a/src/plugins/projectexplorer/toolchainmanager.h
+++ b/src/plugins/projectexplorer/toolchainmanager.h
@@ -94,12 +94,12 @@ private:
 
     void notifyAboutUpdate(ProjectExplorer::ToolChain *);
 
-
     Internal::ToolChainManagerPrivate *const d;
 
     static ToolChainManager *m_instance;
 
-    friend class ProjectExplorerPlugin;
+    friend class Internal::ToolChainManagerPrivate; // for the restoreToolChains methods
+    friend class ProjectExplorerPlugin; // for constructor
     friend class ToolChain;
 };
 
-- 
GitLab