diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-06-07 11:32:45 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-06-07 11:32:45 -0500 |
commit | 6db79851d2f8664216d85ba73246699d8aae94a7 (patch) | |
tree | 4fbdb939af7fd48d72d728064259525095f80bfc /src/kernel/scheduler.C | |
parent | b64188ed609f06ec8b476768f009153472237012 (diff) | |
download | talos-hostboot-6db79851d2f8664216d85ba73246699d8aae94a7.tar.gz talos-hostboot-6db79851d2f8664216d85ba73246699d8aae94a7.zip |
Add scheduler and calls from dispatch interrupt.
Diffstat (limited to 'src/kernel/scheduler.C')
-rw-r--r-- | src/kernel/scheduler.C | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/kernel/scheduler.C b/src/kernel/scheduler.C new file mode 100644 index 000000000..1df91b9eb --- /dev/null +++ b/src/kernel/scheduler.C @@ -0,0 +1,35 @@ +#include <kernel/task.H> +#include <kernel/scheduler.H> +#include <kernel/taskmgr.H> + +void Scheduler::addTask(task_t* t) +{ + if (iv_idleTask != t) + iv_taskList[iv_direction ? 0 : 1].push(t); +} + +void Scheduler::returnRunnable() +{ + this->addTask(TaskManager::getCurrentTask()); +} + +void Scheduler::setNextRunnable() +{ + task_t* t = NULL; + + bool direction = iv_direction; + t = iv_taskList[direction ? 1 : 0].pop(); + + if (NULL == t) + { + iv_taskList[direction ? 0 : 1].pop(); + __sync_bool_compare_and_swap(&iv_direction, direction, !direction); + } + + if (NULL == t) + { + t = iv_idleTask; + } + + TaskManager::setCurrentTask(t); +} |