# HG changeset patch # User Shinji KONO # Date 1260841770 -32400 # Node ID 56487849ea2dec2887c867a23da366f6173236ac # Parent cfca6511aac566dab5e541c9f888319e7a4aff48 cleean up SchedTasks. diff -r cfca6511aac5 -r 56487849ea2d Renderer/Engine/Makefile.def --- a/Renderer/Engine/Makefile.def Mon Dec 14 20:25:03 2009 +0900 +++ b/Renderer/Engine/Makefile.def Tue Dec 15 10:49:30 2009 +0900 @@ -6,7 +6,7 @@ ABI = -m$(ABIBIT) CC = g++ OPT = -g -CFLAGS = -g -Wall $(ABI) $(OPT) # -DSIMPLE_TASK # -DDEBUG +CFLAGS = -g -Wall $(ABI) $(OPT) -DSIMPLE_TASK # -DDEBUG INCLUDE = -I$(CERIUM)/include/TaskManager -I. # LIBS = -L$(CERIUM)/TaskManager -m$(ABIBIT) diff -r cfca6511aac5 -r 56487849ea2d Renderer/Test/Makefile.def --- a/Renderer/Test/Makefile.def Mon Dec 14 20:25:03 2009 +0900 +++ b/Renderer/Test/Makefile.def Tue Dec 15 10:49:30 2009 +0900 @@ -4,7 +4,7 @@ ABIBIT = 32 ABI = -m$(ABIBIT) CC = g++ -CFLAGS = -g -Wall $(ABI) # -DSIPMLE_TASK # -O -DDEBUG +CFLAGS = -g -Wall $(ABI) -DSIPMLE_TASK # -O -DDEBUG INCLUDE = -I$(CERIUM)/include/TaskManager -I$(CERIUM)/Renderer/Engine -I. -I$(CERIUM)/include/Cerium LIBS = -L$(CERIUM)/TaskManager -L$(CERIUM)/Renderer/Engine $(ABI) diff -r cfca6511aac5 -r 56487849ea2d TaskManager/ChangeLog --- a/TaskManager/ChangeLog Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/ChangeLog Tue Dec 15 10:49:30 2009 +0900 @@ -1,3 +1,16 @@ +2009-12-15 Shinji KONO + + SimpleTask の実装が出来たので、TaskArray からは、 + PPU側に詳細な情報を返せる。と言うことは、SPU側から + PPU Task を投入出来る。実装すればだけど。 + + Task 側から書き出し情報を設定するAPIが必要。 + マニュアルも書くか。 + + Down cast をすべてなくしたい。Sched*.cc からは取れました。 + + まだ、いらないものが結構あるらしい... + 2009-12-14 Shinji KONO ようやっと動きました。SIMPLE_TASK でないのとの互換性 @@ -7,6 +20,9 @@ 今までのHTaskを、TaskArray に読み変えるか。前者は変更が 多い。後者は、wait_for が微妙。 + 前者で実装しました。そのうち落すかも。エラーチェックと、 + エラー処理関数が必要。コメントを書かないと。 + 2009-12-12 Shinji KONO SchedTask::next で、TaskArray を認識して、そこで、 @@ -177,6 +193,7 @@ 2009-11-14 Shinji KONO Scheduler / TaskManger / TaskManagerImpl の区別が不明 + HTask は、TaskManagerImpl を持ってる。 Scheduler は SchedTask から直接見えないはずだが、SchedTask は、 Scheduler は知っているが、TaskManager は知らない。これがかなりの diff -r cfca6511aac5 -r 56487849ea2d TaskManager/Makefile.def --- a/TaskManager/Makefile.def Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/Makefile.def Tue Dec 15 10:49:30 2009 +0900 @@ -29,8 +29,8 @@ ABIBIT = 32 -# SIMPLE_TASK=-DSIMPLE_TASK -SIMPLE_TASK= +SIMPLE_TASK=-DSIMPLE_TASK +# SIMPLE_TASK= # OPT = -O9 OPT = -g diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/SchedExit.cc --- a/TaskManager/kernel/schedule/SchedExit.cc Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedExit.cc Tue Dec 15 10:49:30 2009 +0900 @@ -5,7 +5,6 @@ SchedTaskBase* SchedExit::next(Scheduler *scheduler, SchedTaskBase *p) { - // delete p; __debug("SchedExit::next()\n"); diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Tue Dec 15 10:49:30 2009 +0900 @@ -18,16 +18,6 @@ extern TaskObject task_list[MAX_TASK_OBJECT]; -/** - Task Object を作る - */ - - -SchedTask * -createSchedTask(Scheduler *scheduler, TaskPtr task) -{ - return new SchedTask(); -} #if 0 /** @@ -70,9 +60,7 @@ void -SchedTask::init(TaskListPtr _list, TaskPtr _task, int index, - // ListDataPtr rbuf, ListDataPtr wbuf, - Scheduler* sc) +SchedTask::init(TaskListPtr _list, TaskPtr _task, int index, Scheduler* sc) { list = _list; task = _task; @@ -169,8 +157,8 @@ // Task List が残っているので、次を準備 TaskPtr nextTask = &list->tasks[cur_index++]; - SchedTaskBase *nextSched = createSchedTask(scheduler, nextTask); - ((SchedTask*)nextSched)->init(list, nextTask, cur_index, scheduler); + SchedTask *nextSched = new SchedTask(); + nextSched->init(list, nextTask, cur_index, scheduler); #ifdef SIMPLE_TASK if (nextTask->command==TaskArray1) { // compatibility @@ -178,7 +166,7 @@ } if (nextTask->command==TaskArray) { // Start Task Array - return (SchedTaskBase*)(new SchedTaskArrayLoad(scheduler, nextSched)); + return new SchedTaskArrayLoad(scheduler, nextSched); } #endif return nextSched; @@ -189,7 +177,7 @@ return new SchedNop2Ready(scheduler); } else { // 新しいリストに取り掛かる - return createSchedTaskList(nextList, scheduler, 0); + return new SchedTaskList(nextList, scheduler); } } } @@ -201,6 +189,10 @@ return scheduler->id; } +void SchedTask::free_(void *p) { + scheduler->free_(p); +} + #ifndef SIMPLE_TASK /** * task->add_inData で与えられた順番に対応する index (0〜n-1) で、 diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/SchedTask.h --- a/TaskManager/kernel/schedule/SchedTask.h Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Tue Dec 15 10:49:30 2009 +0900 @@ -20,26 +20,35 @@ BASE_NEW_DELETE(SchedTask); // Task を実行するスケジューラ自身 +#if 0 Scheduler *scheduler; +#endif #ifndef SIMPLE_TASK +#if 0 TaskPtr task; +#endif memaddr *param; // read/write 用の ListData ListDataPtr inListData; ListDataPtr outListData; #else +#if 0 SimpleTaskPtr task; +#endif ListData inListData; ListData outListData; #endif /* variables */ +#if 0 // 現在スケジューラが実行している TaskList と、このタスクに対応する Task TaskListPtr list; // Task の、Tasklist での位置。(task = &list[cur_index-1]) int cur_index; +#endif + private: /** @@ -112,9 +121,7 @@ void *allocate(int size); - void free_(void *p) { - scheduler->free_(p); - } + void free_(void *p) ; /* これは禁止するべき */ void dma_load(void *buf, memaddr addr, uint32 size, uint32 mask); @@ -159,12 +166,6 @@ }; -#ifdef SIMPLE_TASK -extern SchedTask* createSchedTask(Scheduler *,SimpleTaskPtr); -#else -extern SchedTask* createSchedTask(Scheduler *,TaskPtr); -#endif - extern void loadSchedTask(Scheduler *scheduler,TaskPtr task); #endif diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/SchedTaskArray.cc --- a/TaskManager/kernel/schedule/SchedTaskArray.cc Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.cc Tue Dec 15 10:49:30 2009 +0900 @@ -6,7 +6,7 @@ SchedTaskArray::SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_, Task *curTask_, Task *_array) { savedTask = savedTask_; - task = curTask_; + atask = curTask_; array = _array; scheduler = s; @@ -29,7 +29,6 @@ SchedTaskArray::SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_) { savedTask = savedTask_; - SchedTask *sv = (SchedTask*)savedTask_; scheduler = s; inListData.bound = 0; @@ -41,9 +40,9 @@ outListData.length = 0; outListData.element = 0; - task = (TaskPtr)&sv->list->tasks[sv->cur_index]; + atask = (TaskPtr)&savedTask->list->tasks[savedTask->cur_index]; array = 0; - sv->cur_index += (task->size()+sizeof(SimpleTask))/sizeof(SimpleTask); + savedTask->cur_index += (atask->size()+sizeof(SimpleTask))/sizeof(SimpleTask); } @@ -53,6 +52,9 @@ { } +/** + * DMA buffer offset in rbuf + */ static void bound(ListData *list) { @@ -65,21 +67,23 @@ } } +/** + * Task data / code read + */ void SchedTaskArray::read() { - __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); // object creation をSchedTaskArray生成時にやらないので、 // exec の直前のread で十分に間に合う - loadSchedTask(scheduler, task->command); + loadSchedTask(scheduler, atask->command); // 読むデータが一つもなければ無視 - if (task->inData_count == 0) return; + if (atask->inData_count == 0) return; - inListData.length = task->inData_count; - inListData.size = task->inData_total_size(); - inListData.element = task->inData(0); + inListData.length = atask->inData_count; + inListData.size = atask->inData_total_size(); + inListData.element = atask->inData(0); inListData.bound = (int*)scheduler->allocate(inListData.length*sizeof(int)); // load Input Data @@ -90,16 +94,18 @@ } - +/** + * Wait read data and execute task + * Start write DMA + */ void SchedTaskArray::exec() { - __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); - if (task->outData_count > 0) { - outListData.length = task->outData_count; - outListData.size = task->outData_total_size(); - outListData.element = task->outData(0); + if (atask->outData_count > 0) { + outListData.length = atask->outData_count; + outListData.size = atask->outData_total_size(); + outListData.element = atask->outData(0); outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int)); bound(&outListData); @@ -107,23 +113,26 @@ } scheduler->dma_wait(DMA_READ); - task_list[task->command].wait(scheduler,task->command); - task_list[task->command].run(this, readbuf, writebuf); + task_list[atask->command].wait(scheduler,atask->command); + task_list[atask->command].run(this, readbuf, writebuf); free(readbuf); // 書き込む領域がなければ無視 // User 側で作る方法が必要... - if (task->outData_count > 0) { + if (atask->outData_count > 0) { // outListData.print(); scheduler->dma_storeList(&outListData, writebuf, DMA_WRITE); } } +/** + * Wait write DMA + * send finish mail + */ void SchedTaskArray::write() { - __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__); scheduler->dma_wait(DMA_WRITE); free(writebuf); @@ -131,7 +140,7 @@ free(outListData.bound); // このTaskArrayは終り。終了を知らせる。 - if (!array || task->next() >= last()) { + if (!array || atask->next() >= last()) { SchedTask *s = (SchedTask *)savedTask; scheduler->mail_write((memaddr)s->task->self); free(array); @@ -148,12 +157,11 @@ SchedTaskBase* SchedTaskArray::next(Scheduler *scheduler, SchedTaskBase *p) { - __debug("[SchedTaskArray:%s]\n", __FUNCTION__); - Task *next = task->next(); + Task *next = atask->next(); if (next < last()) { // Task List が残っているので、次を準備 - return (SchedTaskBase*)new SchedTaskArray(scheduler, savedTask, next, array); + return new SchedTaskArray(scheduler, savedTask, next, array); } else { // このTaskArrayは終り。save していた Task の次を返す。 // savedTask の read/exec は実行されない (command = TaskArray) @@ -229,7 +237,7 @@ memaddr SchedTaskArray::get_param(int index) { - return *task->param(index); + return *atask->param(index); } #endif diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/SchedTaskArray.h --- a/TaskManager/kernel/schedule/SchedTaskArray.h Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.h Tue Dec 15 10:49:30 2009 +0900 @@ -24,7 +24,7 @@ private: /* variables */ - TaskPtr task; + TaskPtr atask; void *readbuf; void *writebuf; diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/SchedTaskArrayLoad.cc --- a/TaskManager/kernel/schedule/SchedTaskArrayLoad.cc Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArrayLoad.cc Tue Dec 15 10:49:30 2009 +0900 @@ -6,10 +6,9 @@ SchedTaskArrayLoad::SchedTaskArrayLoad(Scheduler *s, SchedTaskBase *savedTask_) { - SchedTask *sv = (SchedTask*)savedTask_; scheduler = s; savedTask = savedTask_; - task = sv->task; + task = savedTask->task; } SchedTaskArrayLoad::~SchedTaskArrayLoad() {} diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/SchedTaskBase.h --- a/TaskManager/kernel/schedule/SchedTaskBase.h Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskBase.h Tue Dec 15 10:49:30 2009 +0900 @@ -22,6 +22,24 @@ /* functions */ virtual SchedTaskBase* next(Scheduler *, SchedTaskBase*) {return 0;} + + /* variables */ + + // Task を実行するスケジューラ自身 + Scheduler *scheduler; + +#ifndef SIMPLE_TASK + TaskPtr task; +#else + SimpleTaskPtr task; +#endif + + // 現在スケジューラが実行している TaskList と、このタスクに対応する Task + TaskListPtr list; + // Task の、Tasklist での位置。(task = &list[cur_index-1]) + int cur_index; + + }; #endif diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/SchedTaskList.cc --- a/TaskManager/kernel/schedule/SchedTaskList.cc Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskList.cc Tue Dec 15 10:49:30 2009 +0900 @@ -18,18 +18,13 @@ * SPE で生成されている場合、DMA の必要は無い * 0: メインメモリ, 1: SPE */ -SchedTaskList* -createSchedTaskList(memaddr next_list, Scheduler* scheduler, int renew_flag) -{ - SchedTaskList* sched = new SchedTaskList(next_list, scheduler); - return sched; -} SchedTaskList::SchedTaskList(memaddr addr, Scheduler *sched) { params_addr = addr; list = NULL; scheduler = sched; + cur_index = 0; } @@ -44,37 +39,16 @@ sizeof(TaskList), DMA_READ_TASKLIST); } -SchedTaskBase* -SchedTaskList::next(Scheduler *scheduler, SchedTaskBase *p) +void +SchedTaskList::exec() {} + +void +SchedTaskList::write() { - SchedTaskBase *nextSched; - __debug("[SchedTaskList:%s]\n", __FUNCTION__); scheduler->dma_wait(DMA_READ_TASKLIST); - if (list->length < 1) { - nextSched = new SchedNop2Ready(scheduler); - } else { -#ifdef SIMPLE_TASK - SimpleTaskPtr nextTask = &list->tasks[0]; -#else - TaskPtr nextTask = &list->tasks[0]; -#endif - nextSched = createSchedTask(scheduler, nextTask); - ((SchedTask*)nextSched)->init(list, nextTask, 1, scheduler); -#ifdef SIMPLE_TASK - if (nextTask->command==TaskArray1) { - // compatibility - return new SchedTaskArray(scheduler, nextSched); - } - if (nextTask->command==TaskArray) { - // Start Task Array - return (SchedTaskBase*)(new SchedTaskArrayLoad(scheduler, nextSched)); - } -#endif - } - - return nextSched; } + /* end */ diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/SchedTaskList.h --- a/TaskManager/kernel/schedule/SchedTaskList.h Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskList.h Tue Dec 15 10:49:30 2009 +0900 @@ -3,11 +3,11 @@ #include "base.h" #include "Scheduler.h" -#include "SchedTaskBase.h" +#include "SchedTask.h" #include "error.h" -class SchedTaskList : public SchedTaskBase { +class SchedTaskList : public SchedTask { public: /* constructor */ SchedTaskList(memaddr addr, Scheduler *sched); @@ -16,23 +16,15 @@ /* variables */ memaddr params_addr; - TaskListPtr list; - Scheduler *scheduler; - /* functions */ - SchedTaskBase* next(Scheduler *, SchedTaskBase *); - /* override functions */ - void read(void); + void read(); + void exec(); + void write(); -#ifdef DEBUG - void exec(void) { __debug("[SchedTaskList:%s]\n", __FUNCTION__); } - void write(void) { __debug("[SchedTaskList:%s]\n", __FUNCTION__); } -#endif }; -extern SchedTaskList* createSchedTaskList(memaddr, Scheduler*, int); #endif diff -r cfca6511aac5 -r 56487849ea2d TaskManager/kernel/schedule/Scheduler.h --- a/TaskManager/kernel/schedule/Scheduler.h Mon Dec 14 20:25:03 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.h Tue Dec 15 10:49:30 2009 +0900 @@ -7,7 +7,6 @@ #include "ListData.h" #include "DmaManager.h" #include "SchedTaskBase.h" -#include "SchedTaskList.h" #include "MemList.h" #include "MemHash.h"