* 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
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);
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)
bool m_cache_enable_shaders;
private:
- JMutex m_lock;
+ JMutex m_timeofday_lock;
+ JMutex m_time_lock;
};
/*
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);
}
{