From 7f8f9785d7e9e120a6708d2f51e32dfef3e50c19 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Wed, 4 Mar 2015 11:46:31 +0100 Subject: [PATCH] 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 --- src/environment.cpp | 32 +++++++++++++++++++++++++------- src/environment.h | 18 +++++------------- 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); } { -- 2.25.1