Skip to content

Commit

Permalink
ASyncRunStep doesn't need to lock when do setTimeOfDaySpeed.
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
nerzhul committed Mar 4, 2015
1 parent 1b2f644 commit 7f8f978
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 35 deletions.
32 changes: 25 additions & 7 deletions src/environment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
18 changes: 5 additions & 13 deletions src/environment.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,22 +81,13 @@ class Environment
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)
Expand Down Expand Up @@ -134,7 +125,8 @@ class Environment
bool m_cache_enable_shaders;

private:
JMutex m_lock;
JMutex m_timeofday_lock;
JMutex m_time_lock;

};

Expand Down
25 changes: 10 additions & 15 deletions src/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

{
Expand Down

0 comments on commit 7f8f978

Please sign in to comment.