summaryrefslogtreecommitdiffstats
path: root/src/kernel/scheduler.C
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-06-07 11:32:45 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-06-07 11:32:45 -0500
commit6db79851d2f8664216d85ba73246699d8aae94a7 (patch)
tree4fbdb939af7fd48d72d728064259525095f80bfc /src/kernel/scheduler.C
parentb64188ed609f06ec8b476768f009153472237012 (diff)
downloadtalos-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.C35
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);
+}
OpenPOWER on IntegriCloud