Mercurial > hg > Members > kono > Cerium
changeset 304:e679d401eab3
fix Makefile.cell
author | kono@localhost.localdomain |
---|---|
date | Mon, 08 Jun 2009 18:28:18 +0900 |
parents | a02e863dc69f |
children | dc9d06c60899 |
files | TaskManager/Cell/spe/SchedExit.cc TaskManager/Cell/spe/SchedMail.cc TaskManager/Cell/spe/SchedNop.cc TaskManager/Cell/spe/SchedNop2Ready.cc TaskManager/Cell/spe/SchedTask.cc TaskManager/Cell/spe/SchedTaskList.cc TaskManager/Cell/spe/Scheduler.cc TaskManager/Cell/spe/TaskGroup.cc TaskManager/Makefile.cell |
diffstat | 9 files changed, 12 insertions(+), 1107 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/Cell/spe/SchedExit.cc Mon Jun 08 18:21:01 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -#include <stdio.h> -#include "SchedExit.h" -#include "error.h" - -SchedTaskBase* -SchedExit::next(Scheduler *m, SchedTaskBase *p) -{ - delete p; - - m->show_dma_wait(); - __debug("SchedExit::next()\n"); - - return NULL; -}
--- a/TaskManager/Cell/spe/SchedMail.cc Mon Jun 08 18:21:01 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -#include "SchedMail.h" -#include "SchedTaskList.h" -#include "SchedExit.h" -#include "error.h" - -SchedMail::SchedMail(Scheduler *sched) -{ - scheduler = sched; -} - -SchedTaskBase* -SchedMail::next(Scheduler *m, SchedTaskBase *p) -{ - delete p; - - params_addr = scheduler->mail_read(); - - __debug("[SchedMail:%s]\n", __FUNCTION__); - - if ((int)params_addr == MY_SPE_COMMAND_EXIT) { - return new SchedExit(); - } else { - return new SchedTaskList(params_addr, m); - } -}
--- a/TaskManager/Cell/spe/SchedNop.cc Mon Jun 08 18:21:01 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -#include <stdio.h> -#include "SchedNop.h" -#include "SchedMail.h" -#include "error.h" - -SchedTaskBase* -SchedNop::next(Scheduler *m, SchedTaskBase *p) -{ - __debug("[SPE] SchedNop::next()"); - - delete p; - - return new SchedMail(m); -}
--- a/TaskManager/Cell/spe/SchedNop2Ready.cc Mon Jun 08 18:21:01 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -#include <stdio.h> -#include "SchedNop2Ready.h" -#include "SchedTaskList.h" -#include "SchedMail.h" -#include "error.h" - -SchedNop2Ready::SchedNop2Ready(Scheduler *cn) -{ - scheduler = cn; -} - -void -SchedNop2Ready::exec(void) -{ - __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); - - //scheduler->mail_write(MY_SPE_STATUS_READY); -} - -SchedTaskBase* -SchedNop2Ready::next(Scheduler *m, SchedTaskBase *p) -{ - SchedTaskBase *nextSched; - - __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); - - delete p; - - nextSched = scheduler->get_nextRenewTaskList(); - - // RenewTask がある - if (nextSched) { - return nextSched; - } else { - scheduler->mail_write(MY_SPE_STATUS_READY); - return new SchedMail(scheduler); - } -}
--- a/TaskManager/Cell/spe/SchedTask.cc Mon Jun 08 18:21:01 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,555 +0,0 @@ -#include <stdlib.h> -#include <string.h> -#include "SchedTask.h" -#include "SchedTaskList.h" -#include "SchedNop2Ready.h" -#include "DmaManager.h" -#include "error.h" -#include "TaskManager.h" - -extern Scheduler::TaskObject task_list[MAX_TASK_OBJECT]; - -//#define NO_PIPELINE - -SchedTask* -createSchedTask(TaskPtr task) -{ - return task_list[task->command](); -} - -SchedTask::SchedTask(void) -{ - __list = NULL; - __task = NULL; - __inListData = NULL; - __outListData = NULL; - __readbuf = NULL; - __writebuf = NULL; - __scheduler = NULL; - __taskGroup = NULL; - __renew_flag = 0; - __cur_index = 0; - __flag_renewTask = SCHED_TASK_NORMAL; - - ex_init = &SchedTask::ex_init_normal; - ex_read = &SchedTask::ex_read_normal; - 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) { - free(__inListData); - free(__outListData); - - /** - * __list != NULL の場合、 - * この Task が __list の最後の Task になるので (SchedTask::next 参照) - * このタイミングで __list を解放する - * (free に渡されるアドレスが正しいものとなる)。 - * それ以外の Task では当然解放しない。 - * __list == NULL なので、free に渡しても無問題 - */ - free(__list); - } - - delete smanager; -} - -/** - * このタスクを Renew Task とし、それに応じた関数をセットする - */ -void -SchedTask::__setRenew(void) -{ - __flag_renewTask = SCHED_TASK_RENEW; - - ex_init = &SchedTask::ex_init_renew; - ex_read = &SchedTask::ex_read_renew; - ex_exec = &SchedTask::ex_exec_renew; - ex_write = &SchedTask::ex_write_renew; - ex_next = &SchedTask::ex_next_renew; -} - -void -SchedTask::__init__(TaskListPtr _list, TaskPtr _task, int index, - ListDataPtr rbuf, ListDataPtr wbuf, Scheduler* sc) -{ - __list = _list; - __task = _task; - __inListData = rbuf; - __outListData = wbuf; - __scheduler = sc; - __cur_index = index; - - smanager = new STaskManager(this); - - __scheduler->mainMem_wait(); - - (this->*ex_init)(); -} - -/** - * PPE 内で生成されたタスクの ex_init() - */ -void -SchedTask::ex_init_normal(void) -{ - __scheduler->dma_load(__inListData, (uint32)__task->inData, - sizeof(ListData), DMA_READ_IN_LIST); - __scheduler->dma_load(__outListData, (uint32)__task->outData, - sizeof(ListData), DMA_READ_OUT_LIST); -#if defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_READ_IN_LIST); - __scheduler->dma_wait(DMA_READ_OUT_LIST); -#endif - - __taskGroup = new TaskGroup; - __taskGroup->command = __task->self; -} - -/** - * SPE 内で生成されたタスクの ex_init() - * 各データは SPE 内の create_task 時に生成もしくは引き継がれているので - * ex_init_normal() と違い、ここでは値を渡すだけ - */ -void -SchedTask::ex_init_renew(void) -{ - __inListData = __task->inData; - __outListData = __task->outData; - __taskGroup = (TaskGroupPtr)__task->self; -} - -/** - * [Todo] - * データの読み込み場所を readbuf ではなく、 - * ユーザ自身で決めれるようになるといいかもしれない。 - * - * # TaskManager が勝手に消すことなく、 - * # ユーザが SPE 上に持ち続けることができるため。 - * # もちろん管理はユーザに任せるわけだ。 - */ -void -SchedTask::read(void) -{ - __debug("[SchedTask:%s]\n", __FUNCTION__); - -#if !defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_READ_IN_LIST); - __scheduler->dma_wait(DMA_READ_OUT_LIST); -#endif - - __writebuf = __scheduler->allocate(__outListData->size); - - // 読むデータが一つもなければ無視 - if (__inListData->length == 0) return; - - // load Input Data - __readbuf = __scheduler->allocate(__inListData->size); - __scheduler->dma_loadList(__inListData, __readbuf, DMA_READ); - -#if defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_READ); -#endif - - (this->*ex_read)(); -} - -void -SchedTask::exec(void) -{ - __debug("[SchedTask:%s]\n", __FUNCTION__); - -#if !defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_READ); -#endif - - //run(__readbuf, __writebuf); - (this->*run_func)(__readbuf, __writebuf); - - free(__readbuf); - - if (__taskGroup->status() != 0) { - __task->self = __taskGroup->command; - delete __taskGroup; - __taskGroup = NULL; - } - - - // 書き込む領域がなければ無視 - if (__outListData->length > 0) { - __scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE); - -#if defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_WRITE); - free(__writebuf); -#endif - } - - (this->*ex_exec)(); -} - -void -SchedTask::write(void) -{ - __debug("[SchedTask:%s]\n", __FUNCTION__); - -#if !defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_WRITE); - free(__writebuf); -#endif - - if (__task->self == MY_SPE_NOP) return; - - (this->*ex_write)(); -} - -/** - * PPE 内で生成されたタスクの ex_read() - */ -void -SchedTask::ex_read_normal(void) -{ -} - -/** - * SPE 内で生成されたタスクの ex_read() - */ -void -SchedTask::ex_read_renew(void) -{ -} - -/** - * PPE 内で生成されたタスクの ex_exec() - */ -void -SchedTask::ex_exec_normal(void) -{ -} - -/** - * SPE 内で生成されたタスクの ex_exec() - */ -void -SchedTask::ex_exec_renew(void) -{ -} - - - -/** - * PPE 内で生成されたタスクの ex_write() - * - * このタスク内で新たにタスクが生成され、 - * 且つそのタスクの終了を待つ必要がある場合、 - * PPE に終了したことは知らせない(command は送信しない) - */ -void -SchedTask::ex_write_normal(void) -{ - /** - * このタスク内で新たにタスクが生成されなかった - * or 生成されたが、そのタスクの終了を待つ必要は無い - */ - if (__renew_flag == 0) { - __scheduler->mail_write(__task->self); - } -} - -/** - * SPE 内で生成されたタスクの ex_write() - * - * A <- 親タスク - * | \ - * B C <- SPE 内で生成されたタスク - * - * A は SPE 内で B, C を生成したとする。 - * B と C が終了したら、A が PPE に送るはずだったコマンドが - * 子タスクに引き継がれているので、最後に実行された子タスクが - * PPE に mail 送信する。 - */ -void -SchedTask::ex_write_renew(void) -{ - uint32 cmd; - - __taskGroup->remove(__task); - cmd = __taskGroup->status(); - - // タスク内で作られた全てのタスクが終了した - if (cmd != 0) { - delete __taskGroup; - __scheduler->mail_write(cmd); - } -} - -SchedTaskBase* -SchedTask::next(Scheduler *m, SchedTaskBase *p) -{ - __debug("[SchedTask:%s]\n", __FUNCTION__); - - delete p; - - return (this->*ex_next)(); -} - -SchedTaskBase* -SchedTask::ex_next_normal(void) -{ - if (__cur_index < __list->length) { - SchedTaskBase *nextSched; - - nextSched = __scheduler->get_nextRenewTaskList(); - - // RenewTask がある - if (nextSched) { - __scheduler->set_backupTaskList(__list); - __scheduler->set_backupTaskListIndex(__cur_index); - return nextSched; - } else { - TaskPtr nextTask = &__list->tasks[__cur_index++]; - nextSched = createSchedTask(nextTask); - ((SchedTask*)nextSched)->__init__(__list, nextTask, __cur_index, - __scheduler->get_curReadBuf(), - __scheduler->get_curWriteBuf(), - __scheduler); - return nextSched; - } - } else { - uint32 nextList = (uint32)__list->next; - - if (nextList == 0) { - return new SchedNop2Ready(__scheduler); - } else { - return createSchedTaskList(nextList, __scheduler, - SCHED_TASKLIST_NORMAL); - } - } -} - -/** - * - */ -SchedTaskBase* -SchedTask::ex_next_renew(void) -{ - TaskPtr nextTask; - SchedTask *nextSched; - - if (__cur_index < __list->length) { - nextTask = &__list->tasks[__cur_index++]; - nextSched = createSchedTask(nextTask); - - // RenewTaskList を実行中なので - nextSched->__setRenew(); - nextSched->__init__(__list, nextTask, __cur_index, - __scheduler->get_curReadBuf(), - __scheduler->get_curWriteBuf(), - __scheduler); - - /** - * この理由は SchedTask:~SchedTask() で - */ - __list = NULL; - return nextSched; - } else { - SchedTaskBase *nextList; - - nextList = __scheduler->get_nextRenewTaskList(); - - if (nextList) { - return nextList; - } else { - TaskListPtr nextList = __scheduler->get_backupTaskList(); - - // 中断した TaskList がある - if (nextList) { - __cur_index = __scheduler->get_backupTaskListIndex(); - - nextTask = &nextList->tasks[__cur_index++]; - nextSched = createSchedTask(nextTask); - - nextSched->__init__(nextList, nextTask, __cur_index, - __scheduler->get_curReadBuf(), - __scheduler->get_curWriteBuf(), - __scheduler); - return nextSched; - } else { - return new SchedNop2Ready(__scheduler); - } - } - } -} - -int -SchedTask::get_cpuid(void) -{ - return __scheduler->id; -} - -/** - * task->add_inData で与えられた順番に対応する index (0〜n-1) で、 - * buffer から対応するデータを返す。 - */ -void* -SchedTask::get_input(void *buff, int index) -{ - if (buff != NULL) { - return (void*)((int)buff + __inListData->bound[index]); - } else { - return NULL; - } -} - -/** - * get_input(index) のアドレスを返す - */ -uint32 -SchedTask::get_inputAddr(int index) -{ - return __inListData->element[index].addr; -} - -/** - * get_input(index) のサイズを返す - */ -int -SchedTask::get_inputSize(int index) -{ - return __inListData->element[index].size; -} - -/** - * write buffer の領域を返す。 - */ -void* -SchedTask::get_output(void *buff, int index) -{ - if (buff != NULL) { - return (void*)((int)buff + __outListData->bound[index]); - } else { - return NULL; - } -} - -/** - * get_output(index) のアドレスを返す - */ -uint32 -SchedTask::get_outputAddr(int index) -{ - return __outListData->element[index].addr; -} - -/** - * get_output(index) のサイズを返す - */ -int -SchedTask::get_outputSize(int index) -{ - return __outListData->element[index].size; -} - -int -SchedTask::get_param(int index) -{ - return __task->param[index]; -} - -TaskPtr -SchedTask::create_task(int cmd) -{ - TaskListPtr taskList = __scheduler->get_renewListBuf(); - TaskPtr p = &taskList->tasks[taskList->length++]; - p->command = cmd; - - p->inData = (ListData*)__scheduler->allocate(sizeof(ListData)); - p->outData = (ListData*)__scheduler->allocate(sizeof(ListData)); - - p->inData->clear(); - p->outData->clear(); - - p->self = MY_SPE_NOP; - p->param_size = 0; - - return p; -} - -/** - * 生成したタスクが終了してから、メインスケジューラ(PPE) に - * タスクが終了した旨を知らせる。 - * - * @param[in] waitTask タスク内で生成したタスク - */ -void -SchedTask::wait_task(TaskPtr waitTask) -{ - waitTask->self = (uint32)__taskGroup; - - __scheduler->add_groupTask(__taskGroup, waitTask); - - __renew_flag++; -} - -void* -SchedTask::global_alloc(int id, int size) { - return __scheduler->global_alloc(id, size); -} - -void* -SchedTask::global_get(int id) { - return __scheduler->global_get(id); -} - -void -SchedTask::global_free(int id) { - __scheduler->global_free(id); -} - -void -SchedTask::mainMem_alloc(int id, int size) { - __scheduler->mainMem_alloc(id, size); -} - -void -SchedTask::mainMem_wait(void) { - __scheduler->mainMem_wait(); -} - -void* -SchedTask::mainMem_get(int id) { - return __scheduler->mainMem_get(id); -} - -void* -SchedTask::allocate(int size) { - return __scheduler->allocate(size); -} - -void -SchedTask::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) { - __scheduler->dma_load(buf, addr, size, mask); -} - -void -SchedTask::dma_store(void *buf,uint32 addr, uint32 size, uint32 mask) { - __scheduler->dma_store(buf, addr, size, mask); -} - -void -SchedTask::dma_wait(uint32 mask) { - __scheduler->dma_wait(mask); -}
--- a/TaskManager/Cell/spe/SchedTaskList.cc Mon Jun 08 18:21:01 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -#include <stdlib.h> -#include <string.h> -#include "SchedTaskList.h" -#include "SchedTask.h" -#include "SchedNop2Ready.h" -#include "DmaManager.h" -#include "error.h" - -/** - * SchedTaskList を返す - * - * @param[in] next_list 次の実行する TaskList のアドレス - * @param[in] next_list がメインメモリのアドレスか、 - * SPE で生成されたアドレスかのフラグ - * SPE で生成されている場合、DMA の必要は無い - * 0: メインメモリ, 1: SPE - */ -SchedTaskList* -createSchedTaskList(uint32 next_list, Scheduler* scheduler, int renew_flag) -{ - SchedTaskList* sched = new SchedTaskList(next_list, scheduler); - sched->flag_renewTaskList = renew_flag; - return sched; -} - -SchedTaskList::SchedTaskList(unsigned int addr, Scheduler *sched) -{ - params_addr = addr; - list = NULL; - scheduler = sched; - - flag_renewTaskList = 0; -} - - -void -SchedTaskList::read(void) -{ - __debug("[SchedTaskList:%s]\n", __FUNCTION__); - - if (flag_renewTaskList == SCHED_TASKLIST_NORMAL) { - list = scheduler->get_curListBuf(); - scheduler->dma_load(list, params_addr, - sizeof(TaskList), DMA_READ_TASKLIST); - } else { - list = (TaskListPtr)params_addr; - } -} - -SchedTaskBase* -SchedTaskList::next(Scheduler *m, SchedTaskBase *p) -{ - SchedTaskBase *nextSched; - - __debug("[SchedTaskList:%s]\n", __FUNCTION__); - - delete p; - - scheduler->dma_wait(DMA_READ_TASKLIST); - - if (list->length < 1) { - nextSched = new SchedNop2Ready(scheduler); - - if (flag_renewTaskList == SCHED_TASKLIST_RENEW) { - free(list); - } - - } else { - TaskPtr nextTask = &list->tasks[0]; - nextSched = createSchedTask(nextTask); - - if (flag_renewTaskList == SCHED_TASKLIST_RENEW) { - ((SchedTask*)nextSched)->__setRenew(); - } - - ((SchedTask*)nextSched)->__init__(list, nextTask, 1, - scheduler->get_curReadBuf(), - scheduler->get_curWriteBuf(), - scheduler); - } - - return nextSched; -} -
--- a/TaskManager/Cell/spe/Scheduler.cc Mon Jun 08 18:21:01 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,320 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include "Scheduler.h" -#include "SchedNop.h" -#include "error.h" - -Scheduler::TaskObject task_list[MAX_TASK_OBJECT]; - -Scheduler::~Scheduler(void) -{ - delete connector; -} - -/*! @brief speTaskの入出力のパイプラインバッファを確保する - */ - -void -Scheduler::init(void) -{ - init_impl(); - - for (int i = 0; i < 2; i++) { - buff_taskList[i] = (TaskListPtr)allocate(sizeof(TaskList)); - buff_inListData[i] = (ListDataPtr)allocate(sizeof(ListData)); - buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData)); - } - - buffFlag_taskList = 0; - buffFlag_inListData = 0; - buffFlag_outListData = 0; - flag_renewTaskList = 0; - - // bzero でもいいけど - for (int i = 0; i < MAX_GLOBAL_AREA; i++) { - globalList[i] = NULL; - } - - for (int i = 0; i < MAX_MAINMEM_AREA; i++) { - mainMemList[i] = NULL; - } - - - taskGroup = new TaskGroup; - renewTop_taskList = NULL; - renewCur_taskList = NULL; -} - -void -Scheduler::run(void) -{ - SchedTaskBase* taskTmp; - - task1 = new SchedNop(); - task2 = new SchedNop(); - task3 = new SchedNop(); - - // main loop - do { - __debug("----------\n"); - task3->write(); - task2->exec(); - task1->read(); - - taskTmp = task3; - task3 = task2; - task2 = task1; - task1 = task1->next(this, taskTmp); - } while (task1); - - delete task3; - delete task2; -} - - -void -Scheduler::finish(void) -{ - free(buff_taskList[0]); - free(buff_taskList[1]); - free(buff_inListData[0]); - free(buff_inListData[1]); - free(buff_outListData[0]); - free(buff_outListData[1]); -} - -/** - * あらかじめ memory allocte してある TaskList の領域を - * パイプラインの各処理が交代して使う。 - */ -TaskListPtr -Scheduler::get_curListBuf(void) -{ - buffFlag_taskList ^= 1; - - return buff_taskList[buffFlag_taskList]; -} - - -/** - * あらかじめ memory allocte してある ListData の領域を - * パイプラインの各処理が交代して使う。 - */ -ListDataPtr -Scheduler::get_curWriteBuf(void) -{ - buffFlag_outListData ^= 1; - return buff_outListData[buffFlag_outListData]; -} - - -ListDataPtr -Scheduler::get_curReadBuf(void) -{ - buffFlag_inListData ^= 1; - return buff_inListData[buffFlag_inListData]; -} - -/** - * タスク内で生成されたタスクを格納する TaskList を取得する - * 現在格納に使っている TaskList (renewCur_taskList) が使えるならそれを返す - * もしそうでないなら、新しく TaskList を allocate してそれを返す - * コード中で renewCur_taskList が NULL になるのは - * - プログラム開始時 - * - タスク内生成タスクがある TaskList の実行を新しく始める (Nop2Ready 参照) - * 以上の場合です - */ -TaskListPtr -Scheduler::get_renewListBuf(void) -{ - if (renewCur_taskList && renewCur_taskList->length < TASK_MAX_SIZE) { - return renewCur_taskList; - } else { - TaskListPtr newList = (TaskListPtr)allocate(sizeof(TaskList)); - newList->length = 0; - newList->next = NULL; - renewTop_taskList = TaskList::append(renewTop_taskList, newList); - renewCur_taskList = newList; - return newList; - } -} - -/** - * 次に実行する Renew Task List を返す - * - * @param[in] curList 現在実行中の TaskList - * 中断して RenewTaskList を行うため - * バックアップを取っておく - * @return next RenewTaskList - */ -SchedTaskList* -Scheduler::get_nextRenewTaskList(void) -{ - if (renewTop_taskList) { - TaskListPtr list = renewTop_taskList; - renewTop_taskList = renewTop_taskList->next; - renewCur_taskList = NULL; - - list->next = NULL; - SchedTaskList *sched - = createSchedTaskList((uint32)list, this, SCHED_TASKLIST_RENEW); - return sched; - } else { - return NULL; - } -} - -void -Scheduler::set_backupTaskList(TaskListPtr cur_taskList) -{ - bak_curTaskList = cur_taskList; -} - -void -Scheduler::set_backupTaskListIndex(int cur_index) -{ - bakIndex_taskList = cur_index; -} - -/** - * RenewTaskList 実行前に中断した TaskList を返す - * NULL の場合、中断した TaskList は無い。 - * - * @return TaskList - */ -TaskListPtr -Scheduler::get_backupTaskList(void) -{ - TaskListPtr ret = bak_curTaskList; - - bak_curTaskList = NULL; - return ret; -} - -int -Scheduler::get_backupTaskListIndex(void) -{ - int ret = bakIndex_taskList; - - bakIndex_taskList = 0; - return ret; -} - -void -Scheduler::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) -{ - connector->dma_load(buf, addr, size, mask); -} - -void -Scheduler::dma_store(void *buf, uint32 addr, uint32 size, uint32 mask) -{ - connector->dma_store(buf, addr, size, mask); -} - -void -Scheduler::dma_wait(uint32 mask) -{ - connector->dma_wait(mask); -} - -void -Scheduler::dma_loadList(ListDataPtr list, void *buff, uint32 mask) -{ - connector->dma_loadList(list, buff, mask); -} - - -void -Scheduler::dma_storeList(ListDataPtr list, void *buff, uint32 mask) -{ - return connector->dma_storeList(list, buff, mask); -} - -void -Scheduler::mail_write(uint32 data) -{ - connector->mail_write(data); -} - -uint32 -Scheduler::mail_read(void) -{ - return connector->mail_read(); -} - -TaskGroupPtr -Scheduler::set_groupTask(uint32 command) -{ - TaskGroupPtr ret = taskGroup; - - reload_groupTask(); - - ret->command = command; - return ret; -} - -void -Scheduler::add_groupTask(TaskGroupPtr group, TaskPtr task) -{ - group->add(task); -} - -void -Scheduler::remove_groupTask(TaskGroupPtr group, TaskPtr task) -{ - group->remove(task); -} - -void -Scheduler::reload_groupTask(void) -{ - taskGroup = new TaskGroup; -} - -uint32 -Scheduler::status_groupTask(TaskGroupPtr group) -{ - return group->status(); -} - -void* -Scheduler::global_alloc(int id, int size) -{ - globalList[id] = allocate(size); - return globalList[id]; -} - -void* -Scheduler::global_get(int id) -{ - return globalList[id]; -} - -void -Scheduler::global_free(int id) -{ - free(globalList[id]); - globalList[id] = NULL; -} - -/** - * mainMem_alloc で確保したメインメモリの領域アドレスを返す。 - * これは Fifo, Cell で共通 - */ -void* -Scheduler::mainMem_get(int id) -{ - return mainMemList[id]; -} - - -/** - * 本当は Scheduler クラスに入れるべきなんだろうか。。。 - * なんか手抜きの感がある - */ -void -register_task(int cmd, Scheduler::TaskObject task) -{ - task_list[cmd] = task; -}
--- a/TaskManager/Cell/spe/TaskGroup.cc Mon Jun 08 18:21:01 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -#include "TaskGroup.h" - -void -TaskGroup::add(TaskPtr add_task) { - TaskQueuePtr q = new TaskQueue(add_task); - group = TaskQueue::append(group, q); -} - -void -TaskGroup::remove(TaskPtr delete_task) { - TaskQueuePtr p = group; - TaskQueuePtr p1; - - if (p == NULL) return; - - if (p->task == delete_task) { - group = group->next; - delete p; - } else { - p1 = p->next; - while (p1 && p1->task != delete_task) { - p1 = p1->next; - p = p->next; - } - if (p1) { - p->next = p1->next; - delete p1; - } - } -} - -/** - * 自分が持つ TaskGroup に Task が残っていれば NULL を返す。 - * もう全てのタスクが終了していれば、この TaskGroup を作った - * (一番最初にタスク内タスク生成を行った)タスクが PPE に返すべきだった - * command を返す。 - */ -unsigned int -TaskGroup::status(void) { - /** - * bool の - * true == 1; - * false == 0; - * って保証されてるんだっけ? - */ -#if 1 - return (group == NULL) * command; -#else - if (group.empty()) { - return command; - } else { - return 0; - } -#endif -}
--- a/TaskManager/Makefile.cell Mon Jun 08 18:21:01 2009 +0900 +++ b/TaskManager/Makefile.cell Mon Jun 08 18:28:18 2009 +0900 @@ -3,6 +3,8 @@ TARGET = libCellManager.a SPETARGET = libspemanager.a +CELL_SPE_DIR = $(IMPL_CELL_DIR)/spe + CELL_SPE_SCHEDULE_SRC = $(CELL_SPE_DIR)/SchedExit.cc \ $(CELL_SPE_DIR)/SchedNop2Ready.cc \ $(CELL_SPE_DIR)/SchedTaskList.cc \ @@ -14,8 +16,16 @@ $(CELL_SPE_DIR)/TaskGroup.cc CELL_SPE_SCHEDULE_OBJ = $(CELL_SPE_SCHEDULE_SRC:.cc=.o) -CELL_SPE_DIR = $(IMPL_CELL_DIR)/spe -CELL_SPE_SRCS = $(wildcard $(CELL_SPE_DIR)/*.cc) +CELL_SPE_SRCS = \ + $(CELL_SPE_DIR)/CellDmaManager.cc \ + $(CELL_SPE_DIR)/TaskList.cc \ + $(CELL_SPE_DIR)/CellScheduler.cc \ + $(CELL_SPE_DIR)/TaskQueue.cc \ + $(CELL_SPE_DIR)/Task.cc \ + $(CELL_SPE_DIR)/main.cc + +# $(wildcard $(CELL_SPE_DIR)/*.cc) + CELL_SPE_OBJS = $(CELL_SPE_SRCS:.cc=.o) $(CELL_SPE_SCHEDULE_OBJ) SPUCC = spu-g++