From ce030bc7c9838a2c0c60b18a0e53bb40ff0fda26 Mon Sep 17 00:00:00 2001 From: Tycho Date: Fri, 17 Jan 2014 10:07:33 -0800 Subject: [PATCH 1/4] Implemented xsofts suggestion for a saturating counter in the scheduler --- src/World.cpp | 10 +++++----- src/World.h | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/World.cpp b/src/World.cpp index edf27050d..e4c03699f 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -875,10 +875,6 @@ void cWorld::TickScheduledTasks() Tasks.push_back(m_ScheduledTasks.front()); m_ScheduledTasks.pop_front(); } - for(;itr != m_ScheduledTasks.end(); itr++) - { - (*itr)->Ticks--; - } } // Execute and delete each task: @@ -887,6 +883,9 @@ void cWorld::TickScheduledTasks() (*itr)->Run(*this); delete *itr; } // for itr - m_Tasks[] + + // Increment TickID + m_TickID = (m_TickID+1) &0xFFFF; } @@ -2623,10 +2622,11 @@ void cWorld::QueueTask(cTask * a_Task) void cWorld::ScheduleTask(cScheduledTask * a_Task) { + a_Task->Ticks = (a_Task->Ticks + m_TickID) & 0xFFFF; cCSLock Lock(m_CSScheduledTasks); for(ScheduledTaskList::iterator itr = m_ScheduledTasks.begin(); itr != m_ScheduledTasks.end(); itr++) { - if((*itr)->Ticks >= a_Task->Ticks) + if((*itr)->Ticks >= a_Task->Ticks && (a_Task->Ticks > m_TickID || (*itr)->Ticks < m_TickID)) { m_ScheduledTasks.insert(itr, a_Task); return; diff --git a/src/World.h b/src/World.h index 1ecf41507..2fd7319cf 100644 --- a/src/World.h +++ b/src/World.h @@ -772,6 +772,9 @@ private: /// the future; guarded by m_CSScheduledTasks ScheduledTaskList m_ScheduledTasks; + /// Current Tick number for sceduled tasks + int m_TickID; + /// Guards m_Clients cCriticalSection m_CSClients; From 287144839e446001015b70a34146c6f321812eda Mon Sep 17 00:00:00 2001 From: Tycho Date: Fri, 17 Jan 2014 10:23:40 -0800 Subject: [PATCH 2/4] Increased tick count to long --- src/World.cpp | 4 ++-- src/World.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/World.cpp b/src/World.cpp index e4c03699f..f4b5f1ad8 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -885,7 +885,7 @@ void cWorld::TickScheduledTasks() } // for itr - m_Tasks[] // Increment TickID - m_TickID = (m_TickID+1) &0xFFFF; + m_TickID = (m_TickID+1) & 0x7FFFFFFF; } @@ -2622,7 +2622,7 @@ void cWorld::QueueTask(cTask * a_Task) void cWorld::ScheduleTask(cScheduledTask * a_Task) { - a_Task->Ticks = (a_Task->Ticks + m_TickID) & 0xFFFF; + a_Task->Ticks = (a_Task->Ticks + m_TickID) & 0x7FFFFFFF; cCSLock Lock(m_CSScheduledTasks); for(ScheduledTaskList::iterator itr = m_ScheduledTasks.begin(); itr != m_ScheduledTasks.end(); itr++) { diff --git a/src/World.h b/src/World.h index 2fd7319cf..1fe2740ad 100644 --- a/src/World.h +++ b/src/World.h @@ -773,7 +773,7 @@ private: ScheduledTaskList m_ScheduledTasks; /// Current Tick number for sceduled tasks - int m_TickID; + long m_TickID; /// Guards m_Clients cCriticalSection m_CSClients; From 160a27ccedf0aa8590bcf03abc9154eb1ee7b72d Mon Sep 17 00:00:00 2001 From: Tycho Date: Sat, 18 Jan 2014 06:15:33 -0800 Subject: [PATCH 3/4] switched to using m_WorldAge rather than m_TickID --- src/World.cpp | 9 +++------ src/World.h | 3 --- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/World.cpp b/src/World.cpp index f4b5f1ad8..a466acb84 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -870,7 +870,7 @@ void cWorld::TickScheduledTasks() { cCSLock Lock(m_CSScheduledTasks); ScheduledTaskList::iterator itr = m_ScheduledTasks.begin(); - while (itr != m_ScheduledTasks.end() && (*itr)->Ticks > 0) + while (itr != m_ScheduledTasks.end() && (*itr)->Ticks < m_WorldAge) { Tasks.push_back(m_ScheduledTasks.front()); m_ScheduledTasks.pop_front(); @@ -883,9 +883,6 @@ void cWorld::TickScheduledTasks() (*itr)->Run(*this); delete *itr; } // for itr - m_Tasks[] - - // Increment TickID - m_TickID = (m_TickID+1) & 0x7FFFFFFF; } @@ -2622,11 +2619,11 @@ void cWorld::QueueTask(cTask * a_Task) void cWorld::ScheduleTask(cScheduledTask * a_Task) { - a_Task->Ticks = (a_Task->Ticks + m_TickID) & 0x7FFFFFFF; + a_Task->Ticks = a_Task->Ticks + m_WorldAge; cCSLock Lock(m_CSScheduledTasks); for(ScheduledTaskList::iterator itr = m_ScheduledTasks.begin(); itr != m_ScheduledTasks.end(); itr++) { - if((*itr)->Ticks >= a_Task->Ticks && (a_Task->Ticks > m_TickID || (*itr)->Ticks < m_TickID)) + if((*itr)->Ticks >= a_Task->Ticks) { m_ScheduledTasks.insert(itr, a_Task); return; diff --git a/src/World.h b/src/World.h index 1fe2740ad..1ecf41507 100644 --- a/src/World.h +++ b/src/World.h @@ -772,9 +772,6 @@ private: /// the future; guarded by m_CSScheduledTasks ScheduledTaskList m_ScheduledTasks; - /// Current Tick number for sceduled tasks - long m_TickID; - /// Guards m_Clients cCriticalSection m_CSClients; From d93a4362b4275d94efe9a40a76a095d52448d0d8 Mon Sep 17 00:00:00 2001 From: Tycho Date: Sat, 18 Jan 2014 10:57:25 -0800 Subject: [PATCH 4/4] Fixed iterators bug --- src/World.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/World.cpp b/src/World.cpp index a466acb84..134773f67 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -869,8 +869,7 @@ void cWorld::TickScheduledTasks() // Make a copy of the tasks to avoid deadlocks on accessing m_Tasks { cCSLock Lock(m_CSScheduledTasks); - ScheduledTaskList::iterator itr = m_ScheduledTasks.begin(); - while (itr != m_ScheduledTasks.end() && (*itr)->Ticks < m_WorldAge) + while (!m_ScheduledTasks.empty() && m_ScheduledTasks.front()->Ticks < m_WorldAge) { Tasks.push_back(m_ScheduledTasks.front()); m_ScheduledTasks.pop_front();