Mercurial > hg > Game > Cerium
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)();