void promote::PriorityScheduler<TASK>::run(std::size_t const maxTasks, bool const repeats) { TASK* task(0); // Flush added tasks while( (task = Scheduler<TASK>::getAddedTask()) ) { _tasks.add(Entry(task)); } if( _tasks.isEmpty() ) return; for(std::size_t ii = 0; ii != maxTasks; ++ii) { Entry& entry(_tasks.peek()); TASK* const task(entry.task()); task->process(); if( task->completed() ) { releaseTask(task); _tasks.pop(); if( _tasks.isEmpty() ) { return; } } else { PriorityTask::priority_t const oldPriority(entry.priority()); entry.priority() = task->priority(); if( oldPriority < entry.priority() ) { _tasks.pop(); _tasks.push(Entry(task)); } } } }
HandlerInterface::~HandlerInterface(void){ releaseTask(); }