Mercurial > hg > Members > kono > Cerium
diff include/TaskManager/SchedTask.h @ 308:2ac66db4dd11
remove SchedTaskImpl
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Jun 2009 19:36:48 +0900 |
parents | f8184487cf2c |
children | c59d8927c4d1 |
line wrap: on
line diff
--- a/include/TaskManager/SchedTask.h Mon Jun 08 19:32:38 2009 +0900 +++ b/include/TaskManager/SchedTask.h Mon Jun 08 19:36:48 2009 +0900 @@ -1,26 +1,236 @@ #ifndef INCLUDED_SCHED_TASK #define INCLUDED_SCHED_TASK -#include "SchedTaskImpl.h" - -class SchedTask : public SchedTaskImpl { -public: +#include "base.h" +#include "Scheduler.h" +#include "SchedTaskBase.h" +#include "ListData.h" +#include "TaskGroup.h" - /* variables */ - - virtual ~SchedTask() { - } - +class SchedTask : public SchedTaskBase { +public: /* constructor */ + SchedTask(); + virtual ~SchedTask(); BASE_NEW_DELETE(SchedTask); +private: + /* variables */ + + // Task を実行するスケジューラ自身 + Scheduler *__scheduler; + + // 現在スケジューラが実行している TaskList と、このタスクに対応する Task + TaskListPtr __list; + TaskPtr __task; + + // read/write 用の ListData + ListDataPtr __inListData; + ListDataPtr __outListData; + + /** + * read データ、write 用のバッファ + * readbuf には タスク登録時に設定した入力データが入っている。 + * writebuf にデータを描き込んでおくと、 + * タスク登録時に設定した出力先に書き込む + */ + void *__readbuf; + void *__writebuf; + + // Task の、Tasklist での位置。(task = &list[cur_index-1]) + int __cur_index; + + // タスク内で生成されたタスクのグループ + TaskGroup *__taskGroup; + + // このタスク内で生成されたタスクの数 + int __renew_flag; + + // このタスクが SPE 内で生成されたタスクか否か 1: Yes, 0: No + int __flag_renewTask; + + // タスクがメインメモリ側で生成されたものか、 + // SPE で生成されたものかによって、データの扱いが変わってくる。 + // そのために if (__flag_renewTask) を連発するのはよくないので + // 関数ポインタで持っておく + void (SchedTask::*ex_init)(); + void (SchedTask::*ex_read)(); + void (SchedTask::*ex_exec)(); + void (SchedTask::*ex_write)(); + SchedTaskBase* (SchedTask::*ex_next)(); + + /* functions */ + + // override + void read(); + void exec(); + void write(); + SchedTaskBase* next(Scheduler *, SchedTaskBase *); + // ここをユーザが継承して // それぞれのタスクに対応した処理を記述する - virtual int run(void* r, void *w) { return 0;} + virtual int run(void* r, void *w) { return 0; } + + int (SchedTask::*run_func)(void* r, void *w); + + //--- System API --- + SchedTask* get_nextTask(TaskListPtr list); + + /** + * PPE で生成されたタスクに対する + * __init__, read,exec,write,next の付属(?)処理 + */ + void ex_init_normal(); + void ex_read_normal(); + void ex_exec_normal(); + void ex_write_normal(); + SchedTaskBase* ex_next_normal(); + + /** + * SPE で生成されたタスクに対する + * __inti__, ead,exec,write,next の付属(?)処理 + */ + void ex_init_renew(); + void ex_read_renew(); + void ex_exec_renew(); + void ex_write_renew(); + SchedTaskBase* ex_next_renew(); + +public: + /* functions */ + + void __setRenew(); + void __init__(TaskListPtr _list, TaskPtr _task, int index, + ListDataPtr rbuf, ListDataPtr wbuf, Scheduler* sc); + + //--- User API --- + int get_cpuid(); + + void* get_input(void *buff, int index); + void* get_output(void *buff, int index); + uint32 get_inputAddr(int index); + uint32 get_outputAddr(int index); + int get_inputSize(int index); + int get_outputSize(int index); + int get_param(int index); + + TaskPtr create_task(int cmd); + void wait_task(TaskPtr waitTask); + + void* global_alloc(int id, int size); + void* global_get(int id); + void global_free(int id); + + void mainMem_alloc(int id, int size); + void mainMem_wait(); + void* mainMem_get(int id); + + void *allocate(int size); + + void dma_load(void *buf, uint32 addr, uint32 size, uint32 mask); + void dma_store(void *buf,uint32 addr, uint32 size, uint32 mask); + void dma_wait(uint32 mask); + +private: + class STaskManager { + public: + STaskManager(SchedTask *_t) { + outer = _t; + } + + BASE_NEW_DELETE(STaskManager); + + SchedTask *outer; + int get_cpuid() { + return outer->get_cpuid(); + } + + void* get_input(int index) { + return outer->get_input(outer->__readbuf, index); + } + + void* get_output(int index) { + return outer->get_output(outer->__writebuf, index); + } + + uint32 get_inputAddr(int index) { + return outer->get_inputAddr(index); + } + + uint32 get_outputAddr(int index) { + return outer->get_outputAddr(index); + } + + uint32 get_inputSize(int index) { + return outer->get_inputSize(index); + } + + uint32 get_outputSize(int index) { + return outer->get_outputSize(index); + } + + int get_param(int index) { + return outer->get_param(index); + } + + TaskPtr create_task(int cmd) { + return outer->create_task(cmd); + } + + void wait_task(TaskPtr waitTask) { + outer->wait_task(waitTask); + } + + void* global_alloc(int id, int size) { + return outer->global_alloc(id, size); + } + + void* global_get(int id) { + return outer->global_get(id); + } + + void global_free(int id) { + outer->global_free(id); + } + + void mainMem_alloc(int id, int size) { + outer->mainMem_alloc(id, size); + } + + void mainMem_wait() { + outer->mainMem_wait(); + } + + void* mainMem_get(int id) { + return outer->mainMem_get(id); + } + + void *allocate(int size) { + return outer->allocate(size); + } + + void dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) { + outer->dma_load(buf, addr, size, mask); + } + + void dma_store(void *buf,uint32 addr, uint32 size, uint32 mask) { + outer->dma_store(buf, addr, size, mask); + } + + void dma_wait(uint32 mask) { + outer->dma_wait(mask); + } + }; + + STaskManager *smanager; }; +const int SCHED_TASK_NORMAL = 0; +const int SCHED_TASK_RENEW = 1; + extern SchedTask* createSchedTask(TaskPtr); #endif +