Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/schedule/SchedTask.cc @ 42:aa11038dbdc1
*** empty log message ***
author | gongo |
---|---|
date | Thu, 14 Feb 2008 18:27:37 +0900 |
parents | |
children | 70a0ac46133e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/kernel/schedule/SchedTask.cc Thu Feb 14 18:27:37 2008 +0900 @@ -0,0 +1,101 @@ +#include "SchedTask.h" +#include "SchedTaskList.h" +#include "SchedNop2Ready.h" +#include "DmaManager.h" +#include "error.h" +#include "TaskManager.h" +#include "SymTable.h" + +SymTable *TaskManager::symtb; + +SchedTask::SchedTask(TaskListPtr _list, TaskPtr _task, void *rbuf, void *wbuf, + DmaManager* cn) +{ + list = _list; + task = _task; + readbuf = rbuf; + writebuf = wbuf; + connector = cn; +} + +void +SchedTask::read(void) +{ + __debug("[SchedTask:%s]\n", __FUNCTION__); + + //task = &list->tasks[--list->length]; + connector->dma_load(readbuf, task->in_addr, task->in_size, DMA_READ); +} + +void +SchedTask::exec(void) +{ + __debug("[SchedTask:%s]\n", __FUNCTION__); + + connector->dma_wait(DMA_READ); + + __debug(" task->command = %d\n", task->command); + __debug(" task->in_size = %d\n", task->in_size); + __debug(" task->in_addr = 0x%x\n", task->in_addr); + __debug(" task->out_addr = 0x%x\n", task->out_addr); + __debug(" list->next = 0x%x\n", (unsigned int)list->next); + __debug(" list->length = 0x%x\n", (unsigned int)list->length); + + // obsolute + // task->in_size = func_list[task->command](writebuf, readbuf); + + // ごちゃごちゃしてるな + // 最初から void* じゃなくて 関数ポインタ としていれるべきか? + int (*func)(void*, void*) + = (int (*)(void*,void*))TaskManager::get_address(task->command); + task->in_size = func(writebuf, readbuf); + connector->dma_store(writebuf, task->out_addr, task->in_size, DMA_WRITE); +} + +void +SchedTask::write(void) +{ + __debug("[SchedTask:%s]\n", __FUNCTION__); + + connector->dma_wait(DMA_WRITE); + connector->mail_write((unsigned int)task->self); +} + +SchedTaskBase* +SchedTask::next(Scheduler *m, SchedTaskBase *p) +{ + __debug("[SchedTask:%s]\n", __FUNCTION__); + + delete p; + + // ここ直さねば。どうやって if 文消そう? + // オブジェクト増やせばいいのかな + if (list->length == 0) { + if (list->next == 0) { + return new SchedNop2Ready(connector); + } else { + return new SchedTaskList((unsigned int)list->next, + m->get_curListBuf(), connector); + } + } else { + //return new SchedTask(list, m->get_curReadBuf(), + //m->get_curWriteBuf(), connector); + + // 本当は、ここで task->command に対応する、 + // SchedTask を継承する class を作ればいい。。。はず + return new SchedTask(list, &list->tasks[--list->length], + m->get_curReadBuf(), m->get_curWriteBuf(), + connector); + } +} + +#if 0 +SchedTask +createSchedTask(TaskListPtr list, void *rbuf, void *wbuf, DmaManager *cn) +{ + TaskPtr task; + + task = &list->tasks[--list->length]; + +} +#endif