diff options
author | Sergio Martins <iamsergio@gmail.com> | 2015-08-12 14:24:37 +0100 |
---|---|---|
committer | Sergio Martins <iamsergio@gmail.com> | 2015-08-12 14:29:39 +0100 |
commit | 2716b453a5cb859184784e12c3e0dc5f701fc984 (patch) | |
tree | 36071dacdf7b67788e9324ce11e6aacd4b1b063c | |
parent | 36d61ee54492bc82e58f50bbf65ab4039f2da4ac (diff) | |
download | kconfig-2716b453a5cb859184784e12c3e0dc5f701fc984.tar.gz kconfig-2716b453a5cb859184784e12c3e0dc5f701fc984.tar.bz2 |
Minimize calls to expensive QStandardPaths::locateAll()
It's called a lot at startup as shown by profiling.
heaptrack also complains it does many heap allocations, so cache it.
REVIEW: 124199
-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() |