From ce030bc7c9838a2c0c60b18a0e53bb40ff0fda26 Mon Sep 17 00:00:00 2001 From: Tycho Date: Fri, 17 Jan 2014 10:07:33 -0800 Subject: Implemented xsofts suggestion for a saturating counter in the scheduler --- src/World.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/World.cpp') 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; -- cgit v1.2.3 From 287144839e446001015b70a34146c6f321812eda Mon Sep 17 00:00:00 2001 From: Tycho Date: Fri, 17 Jan 2014 10:23:40 -0800 Subject: Increased tick count to long --- src/World.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/World.cpp') 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++) { -- cgit v1.2.3 From 160a27ccedf0aa8590bcf03abc9154eb1ee7b72d Mon Sep 17 00:00:00 2001 From: Tycho Date: Sat, 18 Jan 2014 06:15:33 -0800 Subject: switched to using m_WorldAge rather than m_TickID --- src/World.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'src/World.cpp') 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; -- cgit v1.2.3 From d93a4362b4275d94efe9a40a76a095d52448d0d8 Mon Sep 17 00:00:00 2001 From: Tycho Date: Sat, 18 Jan 2014 10:57:25 -0800 Subject: Fixed iterators bug --- src/World.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/World.cpp') 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(); -- cgit v1.2.3 From 41618bf242e66744431a1d28e0409f543fb240e4 Mon Sep 17 00:00:00 2001 From: madmaxoft Date: Sun, 19 Jan 2014 23:49:19 +0100 Subject: Changed the cWorld::ScheduleTask() signature. Now it takes the delay in ticks as an argument, and a cTask descendant as the task to run. Lua API has been updated similarly. --- src/World.cpp | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'src/World.cpp') diff --git a/src/World.cpp b/src/World.cpp index 6520702c7..5e9f4a38a 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -865,13 +865,17 @@ void cWorld::TickQueuedTasks(void) } // for itr - m_Tasks[] } -void cWorld::TickScheduledTasks() + + + + +void cWorld::TickScheduledTasks(void) { - ScheduledTaskList Tasks; // Make a copy of the tasks to avoid deadlocks on accessing m_Tasks + cScheduledTasks Tasks; { cCSLock Lock(m_CSScheduledTasks); - while (!m_ScheduledTasks.empty() && m_ScheduledTasks.front()->Ticks < m_WorldAge) + while (!m_ScheduledTasks.empty() && (m_ScheduledTasks.front()->m_TargetTick < m_WorldAge)) { Tasks.push_back(m_ScheduledTasks.front()); m_ScheduledTasks.pop_front(); @@ -879,9 +883,9 @@ void cWorld::TickScheduledTasks() } // Execute and delete each task: - for (ScheduledTaskList::iterator itr = Tasks.begin(), end = Tasks.end(); itr != end; ++itr) + for (cScheduledTasks::iterator itr = Tasks.begin(), end = Tasks.end(); itr != end; ++itr) { - (*itr)->Run(*this); + (*itr)->m_Task->Run(*this); delete *itr; } // for itr - m_Tasks[] } @@ -2627,19 +2631,25 @@ void cWorld::QueueTask(cTask * a_Task) m_Tasks.push_back(a_Task); } -void cWorld::ScheduleTask(cScheduledTask * a_Task) + + + + +void cWorld::ScheduleTask(int a_DelayTicks, cTask * a_Task) { - a_Task->Ticks = a_Task->Ticks + m_WorldAge; + Int64 TargetTick = a_DelayTicks + m_WorldAge; + + // Insert the task into the list of scheduled tasks, ordered by its target tick cCSLock Lock(m_CSScheduledTasks); - for(ScheduledTaskList::iterator itr = m_ScheduledTasks.begin(); itr != m_ScheduledTasks.end(); itr++) + for (cScheduledTasks::iterator itr = m_ScheduledTasks.begin(), end = m_ScheduledTasks.end(); itr != end; ++itr) { - if((*itr)->Ticks >= a_Task->Ticks) + if ((*itr)->m_TargetTick >= TargetTick) { - m_ScheduledTasks.insert(itr, a_Task); + m_ScheduledTasks.insert(itr, new cScheduledTask(TargetTick, a_Task)); return; } } - m_ScheduledTasks.push_back(a_Task); + m_ScheduledTasks.push_back(new cScheduledTask(TargetTick, a_Task)); } -- cgit v1.2.3