From d236165d115b7abe32668d014e5fdcdca1b17377 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Tue, 24 Dec 2019 19:19:32 +0000 Subject: [PATCH] simplify the QSettings write check the previous implementation was supposed to be write-optimized, for cases when QSettings::setValue() followed by QSettings::sync() is called often. it turns out that optimizing for reading from the settings without changing the object is more beneficial as that is often the case. Signed-off-by: Ivailo Monev --- src/core/io/qsettings.cpp | 65 +++++++++-------------------------------------- src/core/io/qsettings_p.h | 2 +- 2 files changed, 13 insertions(+), 54 deletions(-) diff --git a/src/core/io/qsettings.cpp b/src/core/io/qsettings.cpp index 2325ced7d..31c6d6e84 100644 --- a/src/core/io/qsettings.cpp +++ b/src/core/io/qsettings.cpp @@ -345,44 +345,8 @@ QString getSettingsPath(QSettings::Scope scope, const QString &filename, const Q return fallback + QDir::separator() + nameandext; } -class QSettingsLocker -{ -public: - QSettingsLocker(); - ~QSettingsLocker(); - - void addMutex(QMutex *mutex); - void lock(); - -private: - QList mutexes; -}; - -QSettingsLocker::QSettingsLocker() -{ -} - -QSettingsLocker::~QSettingsLocker() -{ - foreach (QMutex *mutex, mutexes) { - mutex->unlock(); - } -} - -void QSettingsLocker::addMutex(QMutex *mutex) -{ - mutexes.append(mutex); -} - -void QSettingsLocker::lock() -{ - foreach (QMutex *mutex, mutexes) { - mutex->lock(); - } -} - QSettingsPrivate::QSettingsPrivate(QSettings::Format format, QSettings::Scope scope) - : format(format), scope(scope), status(QSettings::NoError) + : format(format), scope(scope), status(QSettings::NoError), shouldwrite(false) { QSettingsCustomFormat handler = getSettingsFormat(format); filename = getSettingsPath(scope, QCoreApplication::applicationName(), handler.extension); @@ -391,7 +355,7 @@ QSettingsPrivate::QSettingsPrivate(QSettings::Format format, QSettings::Scope sc } QSettingsPrivate::QSettingsPrivate(const QString &fileName, QSettings::Format format) - : format(format), scope(QSettings::UserScope), status(QSettings::NoError) + : format(format), scope(QSettings::UserScope), status(QSettings::NoError), shouldwrite(false) { QSettingsCustomFormat handler = getSettingsFormat(format); filename = getSettingsPath(scope, fileName, handler.extension); @@ -441,28 +405,17 @@ void QSettingsPrivate::read() void QSettingsPrivate::write() { - QSettings::SettingsMap checkmap = map; + if (!shouldwrite) { + return; + } + QFileInfo info(filename); const QDateTime newstamp = info.lastModified(); if (timestamp < newstamp || !newstamp.isValid()) { QSettingsPrivate::read(); } - if (checkmap == map) { - return; - } QMutexLocker locker(qSettingsMutex()); - QSettingsLocker settingslocker; - for (int i = 0; i < qGlobalSettings()->size(); i++) { - QSettings *setting = qGlobalSettings()->at(i); - QSettingsPrivate *settingpriv = setting->d_func(); - if (settingpriv != this && settingpriv->filename == filename) { - settingslocker.addMutex(&settingpriv->mutex); - } - } - settingslocker.lock(); - locker.unlock(); - QFile file(filename); if (Q_UNLIKELY(!file.open(QFile::WriteOnly))) { status = QSettings::AccessError; @@ -480,6 +433,8 @@ void QSettingsPrivate::write() status = QSettings::FormatError; qWarning("QSettingsPrivate::write: could not write %s", filename.toLocal8Bit().constData()); } + + shouldwrite = false; } void QSettingsPrivate::notify() @@ -490,6 +445,7 @@ void QSettingsPrivate::notify() QSettings *setting = qGlobalSettings()->at(i); if (setting != q && setting->fileName() == q->fileName()) { setting->d_func()->map = map; + setting->d_func()->shouldwrite = shouldwrite; } } } @@ -1041,6 +997,7 @@ void QSettings::clear() { Q_D(QSettings); d->map.clear(); + d->shouldwrite = true; d->notify(); } @@ -1173,6 +1130,7 @@ void QSettings::setValue(const QString &key, const QVariant &value) { Q_D(QSettings); d->map.insert(key, value); + d->shouldwrite = true; d->notify(); } @@ -1185,6 +1143,7 @@ void QSettings::remove(const QString &key) { Q_D(QSettings); d->map.remove(key); + d->shouldwrite = true; d->notify(); } diff --git a/src/core/io/qsettings_p.h b/src/core/io/qsettings_p.h index cc306c6db..78ded1798 100644 --- a/src/core/io/qsettings_p.h +++ b/src/core/io/qsettings_p.h @@ -79,7 +79,7 @@ public: QSettings::ReadFunc readFunc; QSettings::WriteFunc writeFunc; QDateTime timestamp; - QMutex mutex; + bool shouldwrite; }; QT_END_NAMESPACE -- 2.11.0