From: ShadowNinja Date: Thu, 11 Sep 2014 18:23:04 +0000 (-0400) Subject: Fix Settings locking X-Git-Tag: 0.4.11~267 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=2ae5d3f3abc7ac5ee96c4dfc7eeead045fdc775e;p=oweals%2Fminetest.git Fix Settings locking --- diff --git a/src/settings.h b/src/settings.h index 6300ddd6f..bfe7dd5a4 100644 --- a/src/settings.h +++ b/src/settings.h @@ -741,9 +741,7 @@ public: void clear() { JMutexAutoLock lock(m_mutex); - - m_settings.clear(); - m_defaults.clear(); + clearNoLock(); } void updateValue(const Settings &other, const std::string &name) @@ -758,8 +756,6 @@ public: m_settings[name] = val; } catch (SettingNotFoundException &e) { } - - return; } void update(const Settings &other) @@ -770,17 +766,14 @@ public: JMutexAutoLock lock(m_mutex); JMutexAutoLock lock2(other.m_mutex); - m_settings.insert(other.m_settings.begin(), other.m_settings.end()); - m_defaults.insert(other.m_defaults.begin(), other.m_defaults.end()); - - return; + updateNoLock(other); } Settings & operator+=(const Settings &other) { update(other); - return *this; + return *this; } Settings & operator=(const Settings &other) @@ -791,14 +784,27 @@ public: JMutexAutoLock lock(m_mutex); JMutexAutoLock lock2(other.m_mutex); - - clear(); - update(other); + clearNoLock(); + updateNoLock(other); return *this; } private: + + void updateNoLock(const Settings &other) + { + m_settings.insert(other.m_settings.begin(), other.m_settings.end()); + m_defaults.insert(other.m_defaults.begin(), other.m_defaults.end()); + } + + void clearNoLock() + { + m_settings.clear(); + m_defaults.clear(); + } + + std::map m_settings; std::map m_defaults; // All methods that access m_settings/m_defaults directly should lock this.