diff TaskManager/kernel/schedule/SchedTask.cc @ 220:305ac1897c50 draft

fix
author gongo@localhost.localdomain
date Mon, 09 Feb 2009 21:58:45 +0900
parents b56fb6ac2fc4
children a314d8cd2082
line wrap: on
line diff
--- a/TaskManager/kernel/schedule/SchedTask.cc	Mon Feb 09 00:12:40 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Mon Feb 09 21:58:45 2009 +0900
@@ -34,15 +34,20 @@
     ex_exec  = &SchedTask::ex_exec_normal;
     ex_write = &SchedTask::ex_write_normal;
     ex_next  = &SchedTask::ex_next_normal;
+
+    run_func = &SchedTask::run;
 }
 
+/**
+ * dma_store の wait を行う
+ * このタスクが RenewTask だった場合、
+ * __inListData や __outListData は
+ * Scheduler の持つ、使い回しの buffer ではなく
+ * 新たに allocate されたものなので、ここで free する
+ */
 SchedTask::~SchedTask(void)
 {
     if (__flag_renewTask == SCHED_TASK_RENEW) {
-	/**
-	 * __inListData と __outListData はタスク自身のものなので
-	 * 終わったら即 free する。
-	 */
 	free(__inListData);
         free(__outListData);
  
@@ -166,8 +171,9 @@
 
     __scheduler->dma_wait(DMA_READ);
 
-    run(__readbuf, __writebuf);
+    //run(__readbuf, __writebuf);
 
+    (this->*run_func)(__readbuf, __writebuf);
     free(__readbuf);
 
     if (__taskGroup->status() != 0) {
@@ -176,15 +182,6 @@
 	__taskGroup = NULL;
     }
 
-    // 書き込む領域が要らなければ無視
-    if (__outListData->size > 0 || __outListData->length > 0) {
-	__scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE);
-	// SchedTask::write(void) でも wait 掛けてるんだけど、
-        // 実際にはここに wait しないとちゃんと書き込まれてない感じがする
-	// wait はされてるはずなんだがなー
-	__scheduler->dma_wait(DMA_WRITE);
-    }
-
     (this->*ex_exec)();
 }
 
@@ -193,18 +190,11 @@
 {
     __debug("[SchedTask:%s]\n", __FUNCTION__);
 
-    __scheduler->dma_wait(DMA_WRITE);
-    free(__writebuf);
 
-    /**
-     * このタスクはSPE内で生成されたが、
-     * このタスクの終了を待つ必要はない、という設定がされているため、
-     *   (wait_task() が呼ばれていない)
-     * ここで終了する。ex_write は実行しない
-     */
-    if (__task->self == MY_SPE_NOP) return;
-
-    (this->*ex_write)();
+    // 書き込む領域がなければ無視
+    if (__outListData->size > 0 || __outListData->length > 0) {
+	__scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE);
+    }
 }
 
 /**
@@ -292,6 +282,11 @@
 {
     __debug("[SchedTask:%s]\n", __FUNCTION__);
 
+    __scheduler->dma_wait(DMA_WRITE);
+    free(__writebuf);
+
+    (this->*ex_write)();
+
     delete p;
 
     return (this->*ex_next)();