diff options
| -rw-r--r-- | src/core/kconfig.cpp | 40 | 
1 files changed, 30 insertions, 10 deletions
| diff --git a/src/core/kconfig.cpp b/src/core/kconfig.cpp index 3819716b..c6a8017a 100644 --- a/src/core/kconfig.cpp +++ b/src/core/kconfig.cpp @@ -51,9 +51,14 @@ static inline int pclose(FILE *stream)  #include <qdir.h>  #include <QtCore/QProcess>  #include <QtCore/QSet> +#include <QtCore/QBasicMutex> +#include <QtCore/QMutexLocker>  bool KConfigPrivate::mappingsRegistered = false; +Q_GLOBAL_STATIC(QStringList, s_globalFiles); // For caching purposes. +static QBasicMutex s_globalFilesMutex; +  KConfigPrivate::KConfigPrivate(KConfig::OpenFlags flags,                                 QStandardPaths::StandardLocation resourceType)      : openFlags(flags), resourceType(resourceType), mBackend(Q_NULLPTR), @@ -628,6 +633,11 @@ void KConfig::reparseConfiguration()      d->bFileImmutable = false; +    { +        QMutexLocker locker(&s_globalFilesMutex); +        s_globalFiles()->clear(); +    } +      // Parse all desired files from the least to the most specific.      if (d->wantGlobals()) {          d->parseGlobalFiles(); @@ -638,17 +648,27 @@ void KConfig::reparseConfiguration()  QStringList KConfigPrivate::getGlobalFiles() const  { -    QStringList globalFiles; -    Q_FOREACH (const QString &dir1, QStandardPaths::locateAll(QStandardPaths::GenericConfigLocation, QLatin1String("kdeglobals"))) { -        globalFiles.push_front(dir1); -    } -    Q_FOREACH (const QString &dir2, QStandardPaths::locateAll(QStandardPaths::GenericConfigLocation, QLatin1String("system.kdeglobals"))) { -        globalFiles.push_front(dir2); -    } -    if (!etc_kderc.isEmpty()) { -        globalFiles.push_front(etc_kderc); +    QMutexLocker locker(&s_globalFilesMutex); +    if (s_globalFiles()->isEmpty()) { +        const QStringList paths1 = QStandardPaths::locateAll(QStandardPaths::GenericConfigLocation, QLatin1String("kdeglobals")); +        const QStringList paths2 = QStandardPaths::locateAll(QStandardPaths::GenericConfigLocation, QLatin1String("system.kdeglobals")); + +        const bool useEtcKderc = !etc_kderc.isEmpty(); +        s_globalFiles()->reserve(paths1.size() + paths2.size() + (useEtcKderc ? 1 : 0)); + +        Q_FOREACH (const QString &dir1, paths1) { +            s_globalFiles()->push_front(dir1); +        } +        Q_FOREACH (const QString &dir2, paths2) { +            s_globalFiles()->push_front(dir2); +        } + +        if (useEtcKderc) { +            s_globalFiles()->push_front(etc_kderc); +        }      } -    return globalFiles; + +    return *s_globalFiles();  }  void KConfigPrivate::parseGlobalFiles() | 
