diff options
author | Loic Blot <loic.blot@unix-experience.fr> | 2015-03-04 11:46:31 +0100 |
---|---|---|
committer | Loic Blot <loic.blot@unix-experience.fr> | 2015-03-04 11:46:31 +0100 |
commit | 7f8f9785d7e9e120a6708d2f51e32dfef3e50c19 (patch) | |
tree | 454240229e803e8ca87a75e889fd54d3110ad426 /src | |
parent | 1b2f64473ed4f222d3b7f02df853730d4382105e (diff) | |
download | minetest-7f8f9785d7e9e120a6708d2f51e32dfef3e50c19.tar.gz minetest-7f8f9785d7e9e120a6708d2f51e32dfef3e50c19.tar.bz2 minetest-7f8f9785d7e9e120a6708d2f51e32dfef3e50c19.zip |
ASyncRunStep doesn't need to lock when do setTimeOfDaySpeed.
* setTimeOfDaySpeed already lock a mutex when modify the value, we don't need to lock all environment.
* add a fine grain lock for getTimeOfDay and setTimeOfDay to solve environment multithread modifications on this value
Diffstat (limited to 'src')
-rw-r--r-- | src/environment.cpp | 32 | ||||
-rw-r--r-- | src/environment.h | 18 | ||||
-rw-r--r-- | src/server.cpp | 25 |
3 files changed, 40 insertions, 35 deletions
diff --git a/src/environment.cpp b/src/environment.cpp index bafc91c00..217d50fd5 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -203,24 +203,42 @@ u32 Environment::getDayNightRatio() void Environment::setTimeOfDaySpeed(float speed) { - JMutexAutoLock(this->m_lock); + JMutexAutoLock(this->m_timeofday_lock); m_time_of_day_speed = speed; } float Environment::getTimeOfDaySpeed() { - JMutexAutoLock(this->m_lock); + JMutexAutoLock(this->m_timeofday_lock); float retval = m_time_of_day_speed; return retval; } +void Environment::setTimeOfDay(u32 time) +{ + JMutexAutoLock(this->m_time_lock); + m_time_of_day = time; + m_time_of_day_f = (float)time / 24000.0; +} + +u32 Environment::getTimeOfDay() +{ + JMutexAutoLock(this->m_time_lock); + u32 retval = m_time_of_day; + return retval; +} + +float Environment::getTimeOfDayF() +{ + JMutexAutoLock(this->m_time_lock); + float retval = m_time_of_day_f; + return retval; +} + void Environment::stepTimeOfDay(float dtime) { - float day_speed = 0; - { - JMutexAutoLock(this->m_lock); - day_speed = m_time_of_day_speed; - } + // getTimeOfDaySpeed lock the value we need to prevent MT problems + float day_speed = getTimeOfDaySpeed(); m_time_counter += dtime; f32 speed = day_speed * 24000./(24.*3600); diff --git a/src/environment.h b/src/environment.h index 9eb440c42..761e9068b 100644 --- a/src/environment.h +++ b/src/environment.h @@ -81,22 +81,13 @@ public: u32 getDayNightRatio(); // 0-23999 - virtual void setTimeOfDay(u32 time) - { - m_time_of_day = time; - m_time_of_day_f = (float)time / 24000.0; - } - - u32 getTimeOfDay() - { return m_time_of_day; } - - float getTimeOfDayF() - { return m_time_of_day_f; } + virtual void setTimeOfDay(u32 time); + u32 getTimeOfDay(); + float getTimeOfDayF(); void stepTimeOfDay(float dtime); void setTimeOfDaySpeed(float speed); - float getTimeOfDaySpeed(); void setDayNightRatioOverride(bool enable, u32 value) @@ -134,7 +125,8 @@ protected: bool m_cache_enable_shaders; private: - JMutex m_lock; + JMutex m_timeofday_lock; + JMutex m_time_lock; }; diff --git a/src/server.cpp b/src/server.cpp index 0bb91d758..d2af9f5ac 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -535,23 +535,18 @@ void Server::AsyncRunStep(bool initial_step) /* Update time of day and overall game time */ - { - JMutexAutoLock envlock(m_env_mutex); - - m_env->setTimeOfDaySpeed(g_settings->getFloat("time_speed")); + m_env->setTimeOfDaySpeed(g_settings->getFloat("time_speed")); - /* - Send to clients at constant intervals - */ + /* + Send to clients at constant intervals + */ - m_time_of_day_send_timer -= dtime; - if(m_time_of_day_send_timer < 0.0) - { - m_time_of_day_send_timer = g_settings->getFloat("time_send_interval"); - u16 time = m_env->getTimeOfDay(); - float time_speed = g_settings->getFloat("time_speed"); - SendTimeOfDay(PEER_ID_INEXISTENT, time, time_speed); - } + m_time_of_day_send_timer -= dtime; + if(m_time_of_day_send_timer < 0.0) { + m_time_of_day_send_timer = g_settings->getFloat("time_send_interval"); + u16 time = m_env->getTimeOfDay(); + float time_speed = g_settings->getFloat("time_speed"); + SendTimeOfDay(PEER_ID_INEXISTENT, time, time_speed); } { |