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));
            }
        }
    }
}
示例#2
0
HandlerInterface::~HandlerInterface(void){
	releaseTask();
}