aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/kconfig.cpp32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/core/kconfig.cpp b/src/core/kconfig.cpp
index cc3700e1..9b8d2e62 100644
--- a/src/core/kconfig.cpp
+++ b/src/core/kconfig.cpp
@@ -21,6 +21,7 @@
#include <QBasicMutex>
#include <QByteArray>
+#include <QCache>
#include <QCoreApplication>
#include <QDir>
#include <QFile>
@@ -28,6 +29,7 @@
#include <QMutexLocker>
#include <QProcess>
#include <QSet>
+#include <QThreadStorage>
#if KCONFIG_USE_DBUS
#include <QDBusConnection>
@@ -44,6 +46,14 @@ Q_GLOBAL_STATIC(QStringList, s_globalFiles) // For caching purposes.
static QBasicMutex s_globalFilesMutex;
Q_GLOBAL_STATIC_WITH_ARGS(QString, sGlobalFileName, (QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1String("/kdeglobals")))
+using ParseCacheKey = std::pair<QStringList, QString>;
+struct ParseCacheValue {
+ KEntryMap entries;
+ QDateTime parseTime;
+};
+using ParseCache = QThreadStorage<QCache<ParseCacheKey, ParseCacheValue>>;
+Q_GLOBAL_STATIC(ParseCache, sGlobalParse)
+
#ifndef Q_OS_WIN
static const Qt::CaseSensitivity sPathCaseSensitivity = Qt::CaseSensitive;
#else
@@ -687,8 +697,25 @@ void KConfigPrivate::parseGlobalFiles()
const QStringList globalFiles = getGlobalFiles();
// qDebug() << "parsing global files" << globalFiles;
- // TODO: can we cache the values in etc_kderc / other global files
- // on a per-application basis?
+ Q_ASSERT(entryMap.isEmpty());
+ const ParseCacheKey key = {globalFiles, locale};
+ auto data = sGlobalParse->localData().object(key);
+ QDateTime newest;
+ for (const auto &file : globalFiles) {
+ const auto fileDate = QFileInfo(file).lastModified();
+ if (fileDate > newest) {
+ newest = fileDate;
+ }
+ }
+ if (data) {
+ if (data->parseTime < newest) {
+ data = nullptr;
+ } else {
+ entryMap = data->entries;
+ return;
+ }
+ }
+
const QByteArray utf8Locale = locale.toUtf8();
for (const QString &file : globalFiles) {
KConfigBackend::ParseOptions parseOpts = KConfigBackend::ParseGlobal | KConfigBackend::ParseExpansions;
@@ -701,6 +728,7 @@ void KConfigPrivate::parseGlobalFiles()
break;
}
}
+ sGlobalParse->localData().insert(key, new ParseCacheValue({entryMap, newest}));
}
void KConfigPrivate::parseConfigFiles()