diff TaskManager/kernel/schedule/SchedTaskArray.cc @ 695:cbcf0182635e

TaskArray on going...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 12 Dec 2009 17:38:30 +0900
parents
children b5c3ef336878
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/SchedTaskArray.cc	Sat Dec 12 17:38:30 2009 +0900
@@ -0,0 +1,94 @@
+#include "SchedTaskArray.h"
+#include "SchedTask.h"
+
+extern Scheduler::TaskObject task_list[MAX_TASK_OBJECT];
+
+SchedTaskArray::SchedTaskArray(SchedTaskBase *savedTask_, Task *curTask_, Task *_array)
+{
+    savedTask = savedTask_;
+    task = curTask_;
+    array = _array;
+}
+
+/**
+ * dma_store の wait を行う
+ */
+SchedTaskArray::~SchedTaskArray()
+{
+}
+
+void
+SchedTaskArray::read()
+{
+    __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
+
+    // object creation をSchedTaskArray生成時にやらないので、
+    // exec の直前のread で十分に間に合う
+    loadSchedTask(scheduler, task);
+
+    // 読むデータが一つもなければ無視
+    if (task->inData_size == 0) return;
+
+    // load Input Data
+    readbuf = scheduler->allocate(task->inListData()->size);
+    scheduler->dma_loadList(task->inListData(), readbuf, DMA_READ);
+
+}
+
+
+void
+SchedTaskArray::exec()
+{
+    __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
+
+    scheduler->dma_wait(DMA_READ);
+    task_list[task->command].wait(scheduler,task->command);
+    task_list[task->command].run(this, readbuf, writebuf);
+    free(readbuf);
+    // 書き込む領域がなければ無視
+    if (task->outData_size > 0) {
+	writebuf = scheduler->allocate(task->outListData()->size);
+        scheduler->dma_storeList(task->outListData(), writebuf, DMA_WRITE);
+    }
+}
+
+void
+SchedTaskArray::write()
+{
+    __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
+
+    scheduler->dma_wait(DMA_WRITE);
+    free(writebuf);
+
+    // このTaskArrayは終り。終了を知らせる。
+    if (task->next() >= last()) {
+	scheduler->mail_write((memaddr)savedTask->task->self);
+	free(array);
+    }
+
+}
+
+Task *SchedTaskArray::last()
+{
+   return  (Task*)(((char*)array)+ savedTask->read_size());
+}
+
+SchedTaskBase*
+SchedTaskArray::next(Scheduler *scheduler, SchedTaskArrayBase *p)
+{
+    __debug("[SchedTaskArray:%s]\n", __FUNCTION__);
+
+
+    if (task->next() < last()) {
+	// Task List が残っているので、次を準備
+	return (SchedTaskBase*)new SchedTaskArray(savedTask, next, array);
+    } else {
+	// このTaskArrayは終り。save していた Task の次を返す。
+	// savedTask の read/exec は実行されない (command = TaskArray)
+	return savedTask->next();
+    }
+}
+
+
+
+/* end */