ASyncRunStep doesn't need to lock when do setTimeOfDaySpeed.
authorLoic Blot <loic.blot@unix-experience.fr>
Wed, 4 Mar 2015 10:46:31 +0000 (11:46 +0100)
committerLoic Blot <loic.blot@unix-experience.fr>
Wed, 4 Mar 2015 10:46:31 +0000 (11:46 +0100)
* 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
src/environment.h
src/server.cpp

index bafc91c0020c6dde73db000922b91f39226c66a2..217d50fd594b14b9300d6fc1253d2e99d18ddc30 100644 (file)
@@ -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);
index 9eb440c4241558d8225d372a4925e1350044e4f5..761e9068bed2998cba352ecc7345c3d572daf1df 100644 (file)
@@ -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;
 
 };
 
index 0bb91d7584cb3557904cc1eee63c6c6143af284f..d2af9f5acf1e238c635eaae97a286f4a605bb517 100644 (file)
@@ -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);
        }
 
        {