diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 96cb638d1f..3b68725b06 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -212,7 +212,7 @@ bool EntityTree::updateEntityWithElement(EntityItemPointer entity, const EntityI properties.setAccelerationChanged(false); if (wantTerseEditLogging()) { - qCDebug(entities) << senderNode->getUUID() << "physical edits suppressed"; + qCDebug(entities) << (senderNode ? senderNode->getUUID() : "null") << "physical edits suppressed"; } } } diff --git a/libraries/shared/src/SettingManager.cpp b/libraries/shared/src/SettingManager.cpp index 0e05278db6..7c0051c809 100644 --- a/libraries/shared/src/SettingManager.cpp +++ b/libraries/shared/src/SettingManager.cpp @@ -9,6 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include #include "SettingInterface.h" @@ -25,23 +26,27 @@ namespace Setting { // sync will be called in the QSettings destructor } - + void Manager::registerHandle(Setting::Interface* handle) { QString key = handle->getKey(); - if (_handles.contains(key)) { - qWarning() << "Setting::Manager::registerHandle(): Key registered more than once, overriding: " << key; - } - _handles.insert(key, handle); + withWriteLock([&] { + if (_handles.contains(key)) { + qWarning() << "Setting::Manager::registerHandle(): Key registered more than once, overriding: " << key; + } + _handles.insert(key, handle); + }); } - + void Manager::removeHandle(const QString& key) { - _handles.remove(key); + withWriteLock([&] { + _handles.remove(key); + }); } - + void Manager::loadSetting(Interface* handle) { handle->setVariant(value(handle->getKey())); } - + void Manager::saveSetting(Interface* handle) { if (handle->isSet()) { setValue(handle->getKey(), handle->getVariant()); @@ -49,7 +54,7 @@ namespace Setting { remove(handle->getKey()); } } - + static const int SAVE_INTERVAL_MSEC = 5 * 1000; // 5 sec void Manager::startTimer() { if (!_saveTimer) { @@ -61,18 +66,20 @@ namespace Setting { } _saveTimer->start(); } - + void Manager::stopTimer() { if (_saveTimer) { _saveTimer->stop(); } } - + void Manager::saveAll() { - for (auto handle : _handles) { - saveSetting(handle); - } - + withReadLock([&] { + for (auto handle : _handles) { + saveSetting(handle); + } + }); + // Restart timer if (_saveTimer) { _saveTimer->start(); diff --git a/libraries/shared/src/SettingManager.h b/libraries/shared/src/SettingManager.h index f041e39df8..e4981f1bce 100644 --- a/libraries/shared/src/SettingManager.h +++ b/libraries/shared/src/SettingManager.h @@ -16,29 +16,31 @@ #include #include +#include "shared/ReadWriteLockable.h" + namespace Setting { class Interface; - - class Manager : public QSettings { + + class Manager : public QSettings, public ReadWriteLockable { Q_OBJECT protected: ~Manager(); void registerHandle(Interface* handle); void removeHandle(const QString& key); - + void loadSetting(Interface* handle); void saveSetting(Interface* handle); - + private slots: void startTimer(); void stopTimer(); - + void saveAll(); - + private: QHash _handles; QPointer _saveTimer = nullptr; - + friend class Interface; friend void cleanupPrivateInstance(); friend void setupPrivateInstance();