forked from Mirrorlandia_minetest/minetest
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
This commit is contained in:
parent
1b2f64473e
commit
7f8f9785d7
@ -203,24 +203,42 @@ u32 Environment::getDayNightRatio()
|
|||||||
|
|
||||||
void Environment::setTimeOfDaySpeed(float speed)
|
void Environment::setTimeOfDaySpeed(float speed)
|
||||||
{
|
{
|
||||||
JMutexAutoLock(this->m_lock);
|
JMutexAutoLock(this->m_timeofday_lock);
|
||||||
m_time_of_day_speed = speed;
|
m_time_of_day_speed = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
float Environment::getTimeOfDaySpeed()
|
float Environment::getTimeOfDaySpeed()
|
||||||
{
|
{
|
||||||
JMutexAutoLock(this->m_lock);
|
JMutexAutoLock(this->m_timeofday_lock);
|
||||||
float retval = m_time_of_day_speed;
|
float retval = m_time_of_day_speed;
|
||||||
return retval;
|
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)
|
void Environment::stepTimeOfDay(float dtime)
|
||||||
{
|
{
|
||||||
float day_speed = 0;
|
// getTimeOfDaySpeed lock the value we need to prevent MT problems
|
||||||
{
|
float day_speed = getTimeOfDaySpeed();
|
||||||
JMutexAutoLock(this->m_lock);
|
|
||||||
day_speed = m_time_of_day_speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_time_counter += dtime;
|
m_time_counter += dtime;
|
||||||
f32 speed = day_speed * 24000./(24.*3600);
|
f32 speed = day_speed * 24000./(24.*3600);
|
||||||
|
@ -81,22 +81,13 @@ public:
|
|||||||
u32 getDayNightRatio();
|
u32 getDayNightRatio();
|
||||||
|
|
||||||
// 0-23999
|
// 0-23999
|
||||||
virtual void setTimeOfDay(u32 time)
|
virtual void setTimeOfDay(u32 time);
|
||||||
{
|
u32 getTimeOfDay();
|
||||||
m_time_of_day = time;
|
float getTimeOfDayF();
|
||||||
m_time_of_day_f = (float)time / 24000.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 getTimeOfDay()
|
|
||||||
{ return m_time_of_day; }
|
|
||||||
|
|
||||||
float getTimeOfDayF()
|
|
||||||
{ return m_time_of_day_f; }
|
|
||||||
|
|
||||||
void stepTimeOfDay(float dtime);
|
void stepTimeOfDay(float dtime);
|
||||||
|
|
||||||
void setTimeOfDaySpeed(float speed);
|
void setTimeOfDaySpeed(float speed);
|
||||||
|
|
||||||
float getTimeOfDaySpeed();
|
float getTimeOfDaySpeed();
|
||||||
|
|
||||||
void setDayNightRatioOverride(bool enable, u32 value)
|
void setDayNightRatioOverride(bool enable, u32 value)
|
||||||
@ -134,7 +125,8 @@ protected:
|
|||||||
bool m_cache_enable_shaders;
|
bool m_cache_enable_shaders;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
JMutex m_lock;
|
JMutex m_timeofday_lock;
|
||||||
|
JMutex m_time_lock;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -535,23 +535,18 @@ void Server::AsyncRunStep(bool initial_step)
|
|||||||
/*
|
/*
|
||||||
Update time of day and overall game time
|
Update time of day and overall game time
|
||||||
*/
|
*/
|
||||||
{
|
m_env->setTimeOfDaySpeed(g_settings->getFloat("time_speed"));
|
||||||
JMutexAutoLock envlock(m_env_mutex);
|
|
||||||
|
|
||||||
m_env->setTimeOfDaySpeed(g_settings->getFloat("time_speed"));
|
/*
|
||||||
|
Send to clients at constant intervals
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
m_time_of_day_send_timer -= dtime;
|
||||||
Send to clients at constant intervals
|
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();
|
||||||
m_time_of_day_send_timer -= dtime;
|
float time_speed = g_settings->getFloat("time_speed");
|
||||||
if(m_time_of_day_send_timer < 0.0)
|
SendTimeOfDay(PEER_ID_INEXISTENT, time, time_speed);
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user