aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergio Martins <iamsergio@gmail.com>2015-08-12 14:24:37 +0100
committerSergio Martins <iamsergio@gmail.com>2015-08-12 14:29:39 +0100
commit2716b453a5cb859184784e12c3e0dc5f701fc984 (patch)
tree36071dacdf7b67788e9324ce11e6aacd4b1b063c
parent36d61ee54492bc82e58f50bbf65ab4039f2da4ac (diff)
downloadkconfig-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.cpp40
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()