From 7f8118e0cbcea2b54b7c14119626772c88e42d94 Mon Sep 17 00:00:00 2001 From: Mattes D Date: Mon, 13 Oct 2014 14:49:18 +0200 Subject: cWorld: Fixed scheduler. Fixes #1534. Added a test case into the Debuggers plugin. --- src/World.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'src/World.cpp') diff --git a/src/World.cpp b/src/World.cpp index d147b1c84..96afb8cc8 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -1068,15 +1068,24 @@ void cWorld::TickScheduledTasks(void) { cCSLock Lock(m_CSScheduledTasks); auto WorldAge = m_WorldAge; - std::move( - m_ScheduledTasks.begin(), - std::find_if( - m_ScheduledTasks.begin(), - m_ScheduledTasks.end(), - [WorldAge] (cScheduledTaskPtr & Task) { return (Task->m_TargetTick < WorldAge);} - ), - std::back_inserter(Tasks) - ); + + // Move all the due tasks from m_ScheduledTasks into Tasks: + for (auto itr = m_ScheduledTasks.begin(); itr != m_ScheduledTasks.end();) // Cannot use range-basd for, we're modifying the container + { + if ((*itr)->m_TargetTick < WorldAge) + { + auto next = itr; + ++next; + Tasks.push_back(std::move(*itr)); + m_ScheduledTasks.erase(itr); + itr = next; + } + else + { + // All the eligible tasks have been moved, bail out now + break; + } + } } // Execute and delete each task: -- cgit v1.2.3