Mercurial > hg > Game > Cerium
changeset 507:823532f263af draft
merge
author | hiroki@henri.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Mon, 12 Oct 2009 11:27:13 +0900 |
parents | 5d8e364027d5 (current diff) 053da4e2e8bf (diff) |
children | 217d7c53442b 9f23e9d4973f |
files | TaskManager/Cell/spe/Task.cc TaskManager/Cell/spe/TaskList.cc TaskManager/Cell/spe/TaskQueue.cc TaskManager/kernel/ppe/SymTable.cc TaskManager/kernel/ppe/SymTable.h |
diffstat | 61 files changed, 1415 insertions(+), 815 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags Mon Oct 12 11:26:17 2009 +0900 +++ b/.hgtags Mon Oct 12 11:27:13 2009 +0900 @@ -1,2 +1,3 @@ ce5755f544c1a882c7e28b7c78d8b31a82bd9eda cvs 18c42658e0e7c44dfd936834465e01797c26198c fullHD_omedetou +516d5c91d5b4d553844a1ad48ccebbdcd5ebaf20 double-linked-task-list
--- a/TaskManager/Cell/CellHTaskInfo.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/Cell/CellHTaskInfo.cc Mon Oct 12 11:27:13 2009 +0900 @@ -2,30 +2,3 @@ #include <stdlib.h> #include "CellHTaskInfo.h" -int -CellHTaskInfo::extend_pool(int num) -{ - HTaskPtr q = NULL; - - q = (HTaskPtr)malloc(sizeof(HTask)*(num+1)); - - if (q == NULL) { - return -1; - } - q->next = htaskPool; - htaskPool = q; - - /* Connect all free queue in the pool */ - for (q = htaskPool + 1; --num > 0; q++) { - q->next = q + 1; - posix_memalign((void**)&q->inData, DEFAULT_ALIGNMENT, sizeof(ListData)); - posix_memalign((void**)&q->outData, DEFAULT_ALIGNMENT, sizeof(ListData)); - } - q->next = freeHTask; - posix_memalign((void**)&q->inData, DEFAULT_ALIGNMENT, sizeof(ListData)); - posix_memalign((void**)&q->outData, DEFAULT_ALIGNMENT, sizeof(ListData)); - - freeHTask = htaskPool + 1; - - return 0; -}
--- a/TaskManager/Cell/CellHTaskInfo.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/Cell/CellHTaskInfo.h Mon Oct 12 11:27:13 2009 +0900 @@ -6,7 +6,6 @@ class CellHTaskInfo : public HTaskInfo { public: /* functions */ - int extend_pool(int num); }; #endif
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Mon Oct 12 11:27:13 2009 +0900 @@ -5,11 +5,11 @@ #include <string.h> #include "CellTaskManagerImpl.h" #include "CellTaskListInfo.h" -#include "CellHTaskInfo.h" +#include "HTaskInfo.h" #include "PpeScheduler.h" #include "types.h" -CellTaskManagerImpl::~CellTaskManagerImpl(void) +CellTaskManagerImpl::~CellTaskManagerImpl() { delete speThreads; delete [] speTaskList; @@ -25,16 +25,14 @@ } void -CellTaskManagerImpl::init(void) +CellTaskManagerImpl::init() { - taskQueueImpl = new TaskQueueInfo; - taskQueueImpl->init(TASK_MAX_SIZE*4); - taskListImpl = new CellTaskListInfo; taskListImpl->init(machineNum*2); - htaskImpl = new CellHTaskInfo; - htaskImpl->init(TASK_MAX_SIZE*2); + activeTaskQueue = new HTaskInfo(); + + htaskImpl = activeTaskQueue ; // any HTaskInfo speThreads = new SpeThreads(machineNum); speThreads->init(); @@ -53,19 +51,17 @@ } // PPE 側の管理をする Manager ppeManager = new FifoTaskManagerImpl(machineNum); + // 大半のTaskQueueInfoは、共有される ppeManager->init(new PpeScheduler, this); } void CellTaskManagerImpl::append_activeTask(HTaskPtr task) { - TaskQueuePtr q; - - q = taskQueueImpl->create(task); if (task->cpu_type == CPU_PPE) { ppeManager->append_activeTask(task); } else { - activeTaskQueue = TaskQueue::append(activeTaskQueue, q); + activeTaskQueue->addLast(task); } } @@ -82,25 +78,15 @@ * spe に渡される Task だけ入っている */ void -CellTaskManagerImpl::set_runTaskList(void) +CellTaskManagerImpl::set_runTaskList() { // ここ...直すかな TaskListPtr list; - TaskQueuePtr queue; - TaskQueuePtr d; - HTaskPtr htask; + TaskPtr task; int speid; - queue = activeTaskQueue; - if (queue == NULL) { - return ; - } - - while (queue) { - htask = (HTaskPtr)queue->task; - d = queue; - queue = queue->next; + while (HTaskPtr htask = activeTaskQueue->poll()) { if (htask->cpu_type == SPE_ANY) { speid = cur_anySpeid++; @@ -138,17 +124,16 @@ task->outData = htask->outData; task->self = (unsigned int)htask; #else - memcpy(task, htask, sizeof(Task)); + memcpy(task, (Task*)htask, sizeof(Task)); #endif - taskQueueImpl->free(d); + // activeTaskQueue->free_(queue); } - activeTaskQueue = NULL; } void -CellTaskManagerImpl::run(void) +CellTaskManagerImpl::run() { TaskListPtr ppeTaskList = NULL; MailQueuePtr ppeMail = NULL; @@ -185,7 +170,7 @@ CellTaskManagerImpl::mail_check(MailQueuePtr mail_list) { // PPE Scheduler からの mail check - ppeManager->mail_check(mail_list, &waitTaskQueue); + ppeManager->mail_check(mail_list, waitTaskQueue); do { unsigned int data; @@ -258,7 +243,7 @@ // であり、この場合もし SPE にタスクが残っていても // メインループから抜けてプログラム終了となってしまうので // ここでストップかけてます。 - } while (!ppeManager->activeTaskQueue && waitTaskQueue); + } while (ppeManager->activeTaskQueue->empty() && !waitTaskQueue->empty()); return ppeManager->get_runTaskList(); }
--- a/TaskManager/Cell/CellTaskManagerImpl.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.h Mon Oct 12 11:27:13 2009 +0900 @@ -9,7 +9,7 @@ public: /* constructor */ CellTaskManagerImpl(int num = 1) : TaskManagerImpl(num) {} - ~CellTaskManagerImpl(void); + ~CellTaskManagerImpl(); /* variables */ TaskListPtr *speTaskList; @@ -21,10 +21,10 @@ /* functions */ // system - void init(void); - void run(void); + void init(); + void run(); TaskListPtr mail_check(MailQueuePtr mail_list); - void set_runTaskList(void); + void set_runTaskList(); void append_activeTask(HTaskPtr); // user
--- a/TaskManager/Cell/spe/CellScheduler.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/Cell/spe/CellScheduler.cc Mon Oct 12 11:27:13 2009 +0900 @@ -68,14 +68,16 @@ */ #define TEX_LOAD1 0 -#define TEX_LOAD2 1 +// #define TEX_LOAD2 1 uint32 CellScheduler::get_tag() { static int count = 0; - int i = (count++ % 2); - return TEX_LOAD1*i + TEX_LOAD2*(1-i); + // int i = (count++ % 2); + // return TEX_LOAD1*i + TEX_LOAD2*(1-i); + // 0,1,2,3 + return TEX_LOAD1+(count++ % 2); }
--- a/TaskManager/Cell/spe/Task.cc Mon Oct 12 11:26:17 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -#include "Task.h" - -/** - * タスクの入力データを追加する - * - * @param [addr] add input data - * @param [size] size of data at [addr] - * - * @return if ([ret] == 0) ? success : failuer; - */ -int -Task::add_inData_t(unsigned int addr, int size) -{ - return add_data(this->inData, addr, size); -} - -int -Task::add_outData_t(unsigned int addr, int size) -{ - return add_data(this->outData, addr, size); -} - -/** - * エラーの時に -1 を返す、ってことするよりは - * perror みたいにしたほうがわかりやすいかな。 - * - * 現在は 3 個まで。 - * 本当は、3個以上にすると task->param[] には アドレスが入り - * そのアドレスは メインメモリでアロケートされた int の集合。 - */ -int -Task::add_param(int _param) -{ - if (param_size >= MAX_PARAMS) return -1; - - this->param[param_size++] = _param; - return 0; -} - -/* - * エラーの時に -1 を返す、ってことするよりは - * perror みたいにしたほうがわかりやすいかな。 - */ -int -Task::add_data(ListDataPtr list, uint32 addr, int size) -{ - if (list->length >= MAX_LIST_DMA_SIZE) return -1; - - list->bound[list->length] = list->size; - - // size でも制限かけるべき? - list->size += size; - - ListElementPtr elm = &list->element[list->length++]; - elm->addr = addr; - elm->size = size; - - return 0; -}
--- a/TaskManager/Cell/spe/TaskList.cc Mon Oct 12 11:26:17 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -#include "TaskList.h" - -TaskListPtr -TaskList::append(TaskListPtr list, TaskListPtr q) -{ - TaskListPtr p = list; - - if (!p) { - return q; - } else { - while (p->next) p = p->next; - p->next = q; - return list; - } -} -
--- a/TaskManager/Cell/spe/TaskQueue.cc Mon Oct 12 11:26:17 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,21 +0,0 @@ -#include "TaskQueue.h" - -TaskQueue::TaskQueue(TaskPtr q) -{ - task = q; - next = NULL; -} - -TaskQueuePtr -TaskQueue::append(TaskQueuePtr list, TaskQueuePtr q) -{ - TaskQueuePtr p = list; - - if (!p) { - return q; - } else { - while(p->next) p = p->next; - p->next = q; - return list; - } -}
--- a/TaskManager/ChangeLog Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/ChangeLog Mon Oct 12 11:27:13 2009 +0900 @@ -1,3 +1,39 @@ +2009-10-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp> + + ようやっと直せました。inListData/outListData は別に転送しないで、 + 一緒に転送してしまった方が良い。どうせ、いつも転送しているのだから。 + + word_count が fifo の方が高速なのは、どうにかしてください。 + + Renew Task の addInData は、メインメモリからDMAするので正しいらしい。 + 直し方を間違えた。 + + Task をmemcpyして、TaskList に入れているが、List DMA に直すべき。 + Simple Task を常に起動して、List DMA task は、その中で、Renew Task + として起動するのが良いのでは? そうすれば、Task Load 自体を Task に + 出来る。 + + Renew Task の実行順序が filo になっている。このあたり変なので、 + 修正するべきでしょう。Renew用の TaskList を持てば良いんじゃないか? + task->self の ad-hoc な使い方が泣ける。ひどすぎます。 + +2009-10-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp> + + Task 内の create_task は、SchedTask に対してで、 + PPE 上では、Manager に対してだよね。だから、出来る + ことがかなり異なる。これは、まずいだろ? + + 特に、PPE task に明示的に manager を渡すってのは、 + とっても変。 + + Renew Task の特別扱いが、いろいろ歪めているんだが、 + view.cc で使っているので落せない。 + +2009-10-05 Shinji KONO <kono@ie.u-ryukyu.ac.jp> + + TaskQueue のfree list の管理はシステムで一つであるべき。 + TaskQueue は double linked list が当然らしい。 + 2009-10-02 Shinji KONO <kono@ie.u-ryukyu.ac.jp> DrawSpan で、~DrawSpan() で、allocate したデータを DMA_WAIT
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Mon Oct 12 11:27:13 2009 +0900 @@ -35,12 +35,7 @@ taskListImpl = new TaskListInfo; taskQueueImpl = new TaskQueueInfo; - htaskImpl = new HTaskInfo; - - machineNum = machineNum*2; // What!? - - taskQueueImpl->init(TASK_MAX_SIZE*4); - htaskImpl->init(TASK_MAX_SIZE*2); + htaskImpl = new HTaskInfo(); mainTaskList = taskListImpl->create(); @@ -66,9 +61,16 @@ taskListImpl = tm-> taskListImpl ; taskQueueImpl = tm-> taskQueueImpl ; htaskImpl = tm-> htaskImpl ; + waitTaskQueue = NULL; // mail_check で外から設定される +// waitTaskQueue = tm->waitTaskQueue; +// activeTaskQueue = NULL; // CellTaskManagerImple 側を使う + + // waitTaskQueue = tm->waitTaskQueue; + // activeQueue は? mainTaskList = taskListImpl->create(); + } /** @@ -83,13 +85,9 @@ FifoTaskManagerImpl::get_runTaskList() { TaskListPtr list, list_top; - TaskQueuePtr queue; - TaskQueuePtr d; - HTaskPtr htask; // HTask (PPE にある) TaskPtr task; // Task (SPE に送る Task) - queue = activeTaskQueue; - if (queue == NULL) { + if (activeTaskQueue->empty()) { return NULL; } @@ -100,14 +98,22 @@ list_top = taskListImpl->clear_taskList(list_top); list = list_top; - while (queue) { - htask = (HTaskPtr)queue->task; - d = queue; - queue = queue->next; + // printf("active task queue length = %d\n",activeTaskQueue->length()); + while (HTaskPtr htask = activeTaskQueue->poll()) { + task = &list->tasks[list->length++]; +#if 0 + task->command = htask->command; + task->inData = htask->inData; + task->outData = htask->outData; + task->self = (unsigned int)htask; + // param は? +#else + // inData, outData を内蔵にしたので実は、結構でかくない? + // 268 byte 程度だが... 不要な分(設定してない inData, outData, param + // とかもコピーしてるね。rbuf/wbuf の意味を変えてしまったわけか。 + memcpy(task, (Task*)htask, sizeof(Task)); +#endif - task = &list->tasks[list->length++]; - - memcpy(task, htask, sizeof(Task)); if (list->length >= TASK_MAX_SIZE) { TaskListPtr newList = taskListImpl->create(); @@ -115,10 +121,10 @@ list = newList; } - taskQueueImpl->free(d); + // activeTaskQueue->free_(htask); ここで free しないで、 + // mail を待つ } - activeTaskQueue = NULL; mainTaskList = list_top; return list_top; @@ -187,6 +193,13 @@ * NULL なら全てのタスクが実行終了したということ */ void +FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list, HTaskInfo *waitQueue) +{ + waitTaskQueue = waitQueue; + mail_check(mail_list); +} + +void FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list) { MailQueuePtr q = mail_list; @@ -219,13 +232,6 @@ } } -void -FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list, TaskQueuePtr *wait) -{ - waitTaskQueue = *wait; - mail_check(mail_list); -} - void* FifoTaskManagerImpl::allocate(int size) {
--- a/TaskManager/Fifo/FifoTaskManagerImpl.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.h Mon Oct 12 11:27:13 2009 +0900 @@ -13,7 +13,7 @@ /* variables */ int machineNum; - TaskListPtr mainTaskList; + TaskListPtr mainTaskList; // activeTask であるべきなんじゃないの? MailManager *mailManager; MainScheduler *scheduler; @@ -24,7 +24,7 @@ void init(MainScheduler*, TaskManagerImpl*); void run(void); void mail_check(MailQueuePtr mail_list); - void mail_check(MailQueuePtr mail_list, TaskQueuePtr *waitQueue); + void mail_check(MailQueuePtr mail_list, HTaskInfo *waitQueue); TaskListPtr get_runTaskList(void); MailQueuePtr schedule(TaskListPtr);
--- a/TaskManager/Makefile.cell Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/Makefile.cell Mon Oct 12 11:27:13 2009 +0900 @@ -19,15 +19,17 @@ CELL_SPE_SRCS = \ $(CELL_SPE_DIR)/CellDmaManager.cc \ + $(CELL_SPE_DIR)/CellScheduler.cc \ + $(CELL_SPE_DIR)/main.cc + +CELL_SPE_TASK_SRCS = \ $(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 + $(CELL_SPE_DIR)/Task.cc # $(wildcard $(CELL_SPE_DIR)/*.cc) -CELL_SPE_OBJS = $(CELL_SPE_SRCS:.cc=.o) $(CELL_SPE_SCHEDULE_OBJ) +CELL_SPE_OBJS = $(CELL_SPE_SRCS:.cc=.o) $(CELL_SPE_SCHEDULE_OBJ) $(CELL_SPE_TASK_SRCS:.cc=.o) SPUCC = spu-g++ @@ -53,6 +55,8 @@ $(CELL_SPE_SCHEDULE_SRC): kernel/schedule/*.cc cp kernel/schedule/*.cc $(CELL_SPE_DIR)/ cp kernel/memory/*.cc $(CELL_SPE_DIR)/ + cp kernel/ppe/{TaskList.cc,TaskQueue.cc,Task.cc} $(CELL_SPE_DIR)/ + $(CELL_SPE_OBJS): %.o : %.cc $(SPUCC) $(CFLAGS) $(SPE_CFLAGS) $(INCLUDE) -c $< -o $@ @@ -61,7 +65,7 @@ rm -f $(SPETARGET) cellclean: - rm -f $(CELL_SPE_OBJS) $(CELL_SPE_SCHEDULE_SRC) + rm -f $(CELL_SPE_OBJS) $(CELL_SPE_SCHEDULE_SRC) $(CELL_SPE_TASK_SRCS) (cd $(CELL_SPE_DIR); rm -f *~ \#*)
--- a/TaskManager/Test/test_render/Makefile Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/Test/test_render/Makefile Mon Oct 12 11:27:13 2009 +0900 @@ -33,7 +33,7 @@ perl tools/create_sglist.pl xml_file/*.xml run-ps3: - /usr/sbin/ps3-video-mode -v 133 + /usr/*bin/ps3-video-mode -v 133 ./test_nogl -video fb -width 1920 -height 1080 $(CPU) $(SG) run-ps3tv:
--- a/TaskManager/kernel/ppe/HTask.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/HTask.h Mon Oct 12 11:27:13 2009 +0900 @@ -23,13 +23,16 @@ public: BASE_NEW_DELETE(HTask); - TaskQueuePtr wait_me; // List of task waiting for me - TaskQueuePtr wait_i; // List of task for which I am waiting + TaskQueueInfo *wait_me; // List of task waiting for me + TaskQueueInfo *wait_i; // List of task for which I am waiting void (*post_func)(void *arg); void *post_arg; CPU_TYPE cpu_type; + TaskManagerImpl *mimpl; + + HTask *waiter; HTask *next; - TaskManagerImpl *mimpl; + HTask *prev; void spawn(void); void wait_for(HTask *);
--- a/TaskManager/kernel/ppe/HTaskInfo.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/HTaskInfo.cc Mon Oct 12 11:27:13 2009 +0900 @@ -2,49 +2,47 @@ #include <stdlib.h> #include "TaskManagerImpl.h" #include "HTaskInfo.h" +#include "TaskQueueInfo.h" -HTaskInfo::HTaskInfo(void) - :htaskPool(NULL), freeHTask(NULL) {} - -HTaskInfo::~HTaskInfo(void) { destroy(); } +// Singleton HTask Pool +HTaskInfo HTaskInfo::taskQueuePool; -int -HTaskInfo::init(int num) -{ - if (htaskPool == NULL) { - return extend_pool(num); - } - return 0; +HTaskInfo::HTaskInfo() { + // 最初の一つは自分 + first = last = this; + next = prev = this; + waiter = NULL; } -/** - * Fix me - * extend できる限界を設定するべき? - */ +void +HTaskInfo::freePool() { + for(HTaskPtr p = taskQueuePool.waiter; p; ) { + HTaskPtr next = p->waiter; + p->waiter = NULL; + delete p->wait_me; + delete p->wait_i; + free(p); + p = next; + } +} + int HTaskInfo::extend_pool(int num) { - HTaskPtr q = NULL; - - q = (HTaskPtr)malloc(sizeof(HTask)*(num+1)); + HTaskPtr q = (HTaskPtr)malloc(sizeof(HTask)*(num+1)); - if (q == NULL) { - return -1; - } - q->next = htaskPool; - htaskPool = q; + // First Queue is previous pool + q->waiter = waiter; waiter = q; + q++; /* Connect all free queue in the pool */ - for (q = htaskPool + 1; --num > 0; q++) { - q->next = q + 1; - q->inData = (ListDataPtr)malloc(sizeof(ListData)); - q->outData = (ListDataPtr)malloc(sizeof(ListData)); + HTaskPtr p = q; + for (; num-- > 0; p++) { + p->waiter = NULL; + p->wait_me = new TaskQueueInfo(); + p->wait_i = new TaskQueueInfo(); + taskQueuePool.addLast(p); } - q->next = freeHTask; - q->inData = (ListDataPtr)malloc(sizeof(ListData)); - q->outData = (ListDataPtr)malloc(sizeof(ListData)); - - freeHTask = htaskPool + 1; return 0; } @@ -57,54 +55,187 @@ HTaskPtr HTaskInfo::create(int cmd) { - HTaskPtr q; - - if (freeHTask == NULL) { - extend_pool(100); + HTaskPtr q = taskQueuePool.poll(); + if (! q) { + taskQueuePool.extend_pool(64); + q = taskQueuePool.poll(); } - - q = freeHTask; - freeHTask = freeHTask->next; + q->next = q->prev = NULL; + q->waiter = NULL; q->command = cmd; - q->inData->clear(); - q->outData->clear(); - q->self = (unsigned int)q; + q->inData.clear(); + q->outData.clear(); + q->self = (int) q; q->param_size = 0; - q->wait_me = NULL; - q->wait_i = NULL; q->post_func = NULL; q->mimpl = NULL; q->cpu_type = CPU_PPE; + // q->wait_me.clear(); + // q->wait_i.clear(); + return q; } void -HTaskInfo::free(HTaskPtr q) +HTaskInfo::free_(HTaskPtr q) { - q->next = freeHTask; - freeHTask = q; + q->waiter = NULL; + taskQueuePool.addLast(q); +} + + +/*! + HTaskInfo は空にならない。最低1個は要素が入っていて + 1個目は特別扱いする。getFirst すると first->next を返す + */ + +/*! + 最初の1個は特別扱いなので、それの後に追加していく + */ +void +HTaskInfo::addFirst(HTask* e) +{ + e->prev = first; + e->next = first->next; + first->next->prev = e; + first->next = e; } void -HTaskInfo::destroy(void) +HTaskInfo::addLast(HTask* e) { - HTaskPtr q, tmp; +#ifdef CHECK + if (find(e)) { + fprintf(stderr,"Add duplicate task %0x\n",(int)e); + return; + // ... + } +#endif + e->next = first; + e->prev = last; + last->next = e; + last = e; +} -#if 1 - q = htaskPool; - while (q) { - tmp = q->next; - free(q); - q = tmp; - } -#else - for (q = htaskPool; q; q = q->next) { - free(q); +HTask* +HTaskInfo::getFirst() +{ + if (empty()) return NULL; + return first->next; +} + +HTask* +HTaskInfo::getLast() +{ + if (empty()) return NULL; + return last; +} + +int +HTaskInfo::remove(HTask* e) +{ +#ifdef CHECK + if (!find(e)) { + fprintf(stderr,"Remove non existing task %0x\n",(int)e); + return 0; + // ... } #endif + e->prev->next = e->next; + e->next->prev = e->prev; - freeHTask = htaskPool = NULL; + if (first->next == e) { + first->next = e->next; + } + if (last == e) { + last = e->prev; + } + + e->prev = NULL; + e->next = NULL; + + return 1; +} + +/*! + リストの先頭を取得および削除する。リストが空の場合は NULL を返す。 + */ + +HTask* +HTaskInfo::poll() +{ + HTask* e = first->next; + if (e == this) { + return NULL; + } + remove(e); + return e; +} + +void +HTaskInfo::moveToFirst(HTask* e) +{ + remove(e); + addFirst(e); } + +/*! + リスト内の指定された位置にある要素を返す。 + 要素数を超えた位置を指定した場合 NULL を返す。 + */ + +HTask* +HTaskInfo::get(int index) +{ + HTask* e = first->next; + for (int i = 0; i < index; i++) { + if (e == this) return NULL; + e = e->next; + } + return e; +} + +HTask* +HTaskInfo::find(HTask* task) +{ + HTask* e = first->next; + for(;;) { + if (e == this) return NULL; + if (e == task) break; + e = e->next; + } + return e; +} + +int +HTaskInfo::empty() +{ + return next == this; +} + +HTask* +HTaskInfo::getNext(HTask* q) +{ + if (q->next==this) return NULL; + return q->next; +} + +int +HTaskInfo::length() +{ + int i = 1; + if (empty()) return 0; + HTask* e = first; + while((e = e->next) != this ) i++; + return i; +} + + + + +/* end */ + +
--- a/TaskManager/kernel/ppe/HTaskInfo.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/HTaskInfo.h Mon Oct 12 11:27:13 2009 +0900 @@ -1,29 +1,48 @@ #ifndef INCLUDED_HTASK_INFO #define INCLUDED_HTASK_INFO +#include "Task.h" #include "HTask.h" -class HTaskInfo { +class HTaskInfo : public HTask { + public: /* constructor */ - HTaskInfo(void); - virtual ~HTaskInfo(void); + HTaskInfo(); + + BASE_NEW_DELETE(HTaskInfo); /* functions */ - int init(int num); HTaskPtr create(int cmd); - void free(HTaskPtr q); - virtual int extend_pool(int num); + + void free_(HTaskPtr queue); -protected: + void addFirst(HTask* e); + void addLast(HTask* e); + HTask* getFirst(); + HTask* getLast(); + int remove(HTask* e); + HTask* poll(); + void moveToFirst(HTask* e); // or use(); + HTask* get(int index); + HTask* find(HTask *task); + int empty(); + void freePool() ; + + // Iterator + HTask* getNext(HTask* q) ; + int length(); + +private: /* variables */ - HTaskPtr htaskPool; - HTaskPtr freeHTask; + + static HTaskInfo taskQueuePool; + HTask* first; + HTask* last; /* functions */ - void destroy(void); - -private: + int extend_pool(int num); + void destroy(); }; #endif
--- a/TaskManager/kernel/ppe/SymTable.cc Mon Oct 12 11:26:17 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -#include <string.h> -#include "SymTable.h" - -SymTable::~SymTable(void) -{ - SymTbPtr tb; - - for (int i = 0; i < symtb_index; i++) { - tb = &symtb[i]; - delete [] tb->sym; - } - - delete [] symtb; -} - -void -SymTable::init(void) -{ - symtb = new SymTb[SYM_MAX_SIZE]; - symtb_index = 0; -} - -void -SymTable::set_symbol(const char *sym, FuncObject addr) -{ - SymTbPtr tb = &symtb[symtb_index++]; - - tb->sym = new char[strlen(sym)+1]; - memcpy(tb->sym, sym, strlen(sym)+1); - tb->address = addr; -} - -void -SymTable::set_func(int id, FuncObject addr) -{ - SymTbPtr tb = &symtb[id]; - - tb->address = addr; -} - -SymTable::FuncObject -SymTable::get_address(int fd) -{ - if (fd >= symtb_index) { - // Fix me - // error process - } - - return symtb[fd].address; -} - - -int -SymTable::get_fd(const char *sym) -{ - SymTbPtr tb; - - for (int i = 0; i < SYM_MAX_SIZE; i++) { - tb = &symtb[i]; - if (strcmp(tb->sym, sym) == 0) { - return i; - } - } - - return -1; -}
--- a/TaskManager/kernel/ppe/SymTable.h Mon Oct 12 11:26:17 2009 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -#ifndef INCLUDED_SYMTABLE -#define INCLUDED_SYMTABLE - -#define SYM_MAX_SIZE 64 - -class SymTable { -public: - ~SymTable(void); - - typedef int (*FuncObject)(void *, void*); - - typedef struct sym_table { - char *sym; - FuncObject address; - } SymTb, *SymTbPtr; - - SymTbPtr symtb; - int symtb_index; - - void init(void); - void set_symbol(const char *sym, FuncObject addr); - void set_func(int id, FuncObject addr); - int get_fd(const char *sym); - FuncObject get_address(int fd); -}; - -#endif
--- a/TaskManager/kernel/ppe/Task.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.cc Mon Oct 12 11:27:13 2009 +0900 @@ -11,7 +11,7 @@ int Task::add_inData_t(unsigned int addr, int size) { - return add_data(this->inData, addr, size); + return add_data(inData, addr, size); } /** @@ -25,12 +25,16 @@ int Task::add_outData_t(unsigned int addr, int size) { - return add_data(this->outData, addr, size); + return add_data(outData, addr, size); } /** * エラーの時に -1 を返す、ってことするよりは * perror みたいにしたほうがわかりやすいかな。 + * + * 現在は 3 個まで。 + * 本当は、3個以上にすると task->param[] には アドレスが入り + * そのアドレスは メインメモリでアロケートされた int の集合。 */ int Task::add_param(int _param) @@ -46,16 +50,16 @@ * perror みたいにしたほうがわかりやすいかな。 */ int -Task::add_data(ListDataPtr list, uint32 addr, int size) +Task::add_data(ListData& list, uint32 addr, int size) { - if (list->length >= MAX_LIST_DMA_SIZE) return -1; + if (list.length >= MAX_LIST_DMA_SIZE) return -1; - list->bound[list->length] = list->size; + list.bound[list.length] = list.size; // size でも制限かけるべき? - list->size += size; + list.size += size; - ListElementPtr elm = &list->element[list->length++]; + ListElementPtr elm = &list.element[list.length++]; elm->addr = addr; elm->size = size;
--- a/TaskManager/kernel/ppe/Task.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/Task.h Mon Oct 12 11:27:13 2009 +0900 @@ -7,23 +7,25 @@ #define MAX_PARAMS 8 +class TaskQueue; + class Task { public: // variables BASE_NEW_DELETE(Task); int command; // 4 byte - ListDataPtr inData; // 4 byte 64bit であるべき - ListDataPtr outData; // 4 byte 64bit であるべき - uint32 self; // 4 byte + int self; // 4 byte int param_size; // 4 byte int param[MAX_PARAMS]; // 4*MAX_PARAMS byte + ListData inData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); // 4 byte 64bit であるべき + ListData outData __attribute__ ((aligned (DEFAULT_ALIGNMENT))); // 4 byte 64bit であるべき public: // functions int add_inData_t(unsigned int addr, int size); // unsigned int ではなく 64bit int add_outData_t(unsigned int addr, int size); // unsigned int ではなく 64bit - int add_data(ListDataPtr list, unsigned int addr, int size); + int add_data(ListData &list, unsigned int addr, int size); int add_param(int param); #define add_inData(addr, size) \
--- a/TaskManager/kernel/ppe/TaskListInfo.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskListInfo.cc Mon Oct 12 11:27:13 2009 +0900 @@ -112,3 +112,12 @@ return list; } +int +TaskListInfo::length(TaskListPtr list) +{ + int i = 0; + if (!list) return i; + while((list=list->next)) i++; + return i; +} +
--- a/TaskManager/kernel/ppe/TaskListInfo.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskListInfo.h Mon Oct 12 11:27:13 2009 +0900 @@ -18,6 +18,8 @@ virtual int extend_pool(int num); TaskListPtr clear_taskList(TaskListPtr list); + static int length(TaskListPtr list); + protected: /* variables */ TaskListPtr taskListPool;
--- a/TaskManager/kernel/ppe/TaskManager.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManager.cc Mon Oct 12 11:27:13 2009 +0900 @@ -90,3 +90,5 @@ TaskManager::get_scheduler() { return m_impl->get_scheduler(); } + +/* end */
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Mon Oct 12 11:27:13 2009 +0900 @@ -13,7 +13,12 @@ } TaskManagerImpl::TaskManagerImpl(int num) - : machineNum(num), activeTaskQueue(NULL), waitTaskQueue(NULL) {} + : machineNum(num) { + activeTaskQueue = new HTaskInfo(); + waitTaskQueue = new HTaskInfo(); + htaskImpl = waitTaskQueue ; // any HTaskInfo + taskQueueImpl = new TaskQueueInfo(); +} /** * 一番最初に PPE で実行される systask_start @@ -21,7 +26,7 @@ * 番兵的な意味で実装 */ void -TaskManagerImpl::systask_init(void) +TaskManagerImpl::systask_init() { systask_register(); @@ -62,8 +67,9 @@ m = taskQueueImpl->create(master); s = taskQueueImpl->create(slave); - master->wait_me = TaskQueue::append(master->wait_me, s); - slave->wait_i = TaskQueue::append(slave->wait_i, m); + master->wait_me->addLast(s); + slave->wait_i->addLast(m); + s->waiter = m; } /** @@ -76,7 +82,7 @@ { // waiter // master // waitee // slave - if (task->wait_i == NULL) { + if (task->wait_i->empty()) { append_activeTask(task); } else { append_waitTask(task); @@ -89,12 +95,9 @@ * Task を実行可能キューに追加する */ void -TaskManagerImpl::append_activeTask(HTaskPtr task) +TaskManagerImpl::append_activeTask(HTaskPtr q) { - TaskQueuePtr q; - - q = taskQueueImpl->create(task); - activeTaskQueue = TaskQueue::append(activeTaskQueue, q); + activeTaskQueue->addLast(q); } /** @@ -112,46 +115,41 @@ /** * 終了したタスクから依存の処理とか * post_func() はこのタスクが終了したら実行する関数。 - * 今のところ使ってないっす * * @param [task] 終了したタスク */ void -TaskManagerImpl::check_task_finish(HTaskPtr task) +TaskManagerImpl::check_task_finish(HTaskPtr me) { - notify_wait_taskQueue(task, task->wait_me); - task->post_func(task->post_arg); - htaskImpl->free(task); + // post_func を先に実行しないと、systask_finish が active_queue + // 移されてから、wait_for されるという事態が起きることがある。 + + me->post_func(me->post_arg); + + while(TaskQueue *p = me->wait_me->poll()) { + HTaskPtr you = p->task; + TaskQueueInfo *wait_i = you->wait_i; + // 相手の wait queue から自分(を指しているTaskQueue)を削除 + wait_i->remove(p->waiter); + // queue を free する + wait_i->free_(p->waiter); + + if (wait_i->empty()) { + waitTaskQueue->remove(you); + append_activeTask(you); + } + + wait_i->free_(p); + } + + htaskImpl->free_(me); } -/** - * 終了したタスク [depend] を待っている TaskList に - * 終わった事を知らせる(削除する - */ -void -TaskManagerImpl::notify_wait_taskQueue(HTaskPtr depend, TaskQueuePtr list) -{ - TaskQueuePtr p; - HTaskPtr task; - - p = list; // wait task list - - while (p) { - task = (HTaskPtr)p->task; - task->wait_i = remove_taskQueue_eq_task(task->wait_i, depend); - p = p->next; - } - - remove_taskQueue_all(list); -} void -TaskManagerImpl::append_waitTask(HTaskPtr task) +TaskManagerImpl::append_waitTask(HTaskPtr q) { - TaskQueuePtr q; - - q = taskQueueImpl->create(task); - waitTaskQueue = TaskQueue::append(waitTaskQueue, q); + waitTaskQueue ->addLast(q); } /** @@ -159,89 +157,9 @@ * activeQueue へ移す */ void -TaskManagerImpl::wakeup_waitTask(void) +TaskManagerImpl::wakeup_waitTask() { - TaskQueuePtr p, tmp; - - p = waitTaskQueue; - while (p) { - HTaskPtr task = (HTaskPtr)p->task; - tmp = p; - p = p->next; - if (task->wait_i == NULL) { - append_activeTask(task); - waitTaskQueue = remove_taskQueue(waitTaskQueue, tmp); - } - } -} - -void -TaskManagerImpl::remove_taskQueue_all(TaskQueuePtr list) -{ - TaskQueuePtr p = list; - TaskQueuePtr p1; - - while (p != NULL) { - p1 = p->next; - taskQueueImpl->free(p); - p = p1; - } + // done in check_task_finish } -/** - * [list] が持つ queue->task の中に [task] と同じ奴があれば - * 削除する。まあ remove_taskQueue() の HTask で比較するverです。 - * こういうのはオーバーロードでやるもんなのかな? - */ -TaskQueuePtr -TaskManagerImpl::remove_taskQueue_eq_task(TaskQueuePtr list, HTaskPtr task) -{ - TaskQueuePtr p = list; - TaskQueuePtr p1; - - if (p == NULL) return p; - - if (p->task == task) { - list = list->next; - taskQueueImpl->free(p); - } else { - p1 = p->next; - while (p1 && p1->task && p1->task != task) { - p1 = p1->next; - p = p->next; - } - if (p1) { - p->next = p1->next; - taskQueueImpl->free(p1); - } - } - - return list; -} - -TaskQueuePtr -TaskManagerImpl::remove_taskQueue(TaskQueuePtr list, TaskQueuePtr q) -{ - TaskQueuePtr p = list; - TaskQueuePtr p1; - - if (!p) return p; - - if (p == q) { - list = list->next; - taskQueueImpl->free(p); - } else { - p1 = p->next; - while (p1 && p1 != q) { - p1 = p1->next; - p = p->next; - } - if (p1) { - p->next = p1->next; - taskQueueImpl->free(p1); - } - } - - return list; -} - +/* end */
--- a/TaskManager/kernel/ppe/TaskManagerImpl.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.h Mon Oct 12 11:27:13 2009 +0900 @@ -11,35 +11,32 @@ class TaskManagerImpl { public: - /* constructor */ - TaskManagerImpl(int num = 1); - virtual ~TaskManagerImpl(void) {} /* variables */ int machineNum; - TaskQueuePtr activeTaskQueue; - TaskQueuePtr waitTaskQueue; + HTaskInfo *activeTaskQueue; + HTaskInfo *waitTaskQueue; - /* variables */ TaskListInfo *taskListImpl; TaskQueueInfo *taskQueueImpl; HTaskInfo *htaskImpl; + /* constructor */ + TaskManagerImpl(int num = 1) ; + + virtual ~TaskManagerImpl() { } + /* functions */ // system - virtual void init(void) = 0; - virtual void run(void) = 0; + virtual void init() = 0; + virtual void run() = 0; virtual void append_activeTask(HTaskPtr); virtual void append_waitTask(HTaskPtr); void check_task_finish(HTaskPtr task); - void notify_wait_taskQueue(HTaskPtr depend, TaskQueuePtr list); - TaskQueuePtr remove_taskQueue(TaskQueuePtr list, TaskQueuePtr task); - TaskQueuePtr remove_taskQueue_eq_task(TaskQueuePtr list, HTaskPtr task); - void remove_taskQueue_all(TaskQueuePtr list); - void wakeup_waitTask(void); + void wakeup_waitTask(); - void systask_init(void); + void systask_init(); // user HTaskPtr create_task(int cmd);
--- a/TaskManager/kernel/ppe/TaskQueue.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskQueue.cc Mon Oct 12 11:27:13 2009 +0900 @@ -1,21 +1,29 @@ #include "TaskQueue.h" -TaskQueue::TaskQueue(TaskPtr q) +TaskQueue::TaskQueue(HTask *q) { task = q; next = NULL; + prev = NULL; + waiter = NULL; } +/* + * こんなものは使いたくないが、renew task/task group が + * が、あまりに ad-hoc で直し切れないので、とりあえず、 + * 存続。TaskQueueInfo は SchedTask で使うにはでかすぎる。 + */ TaskQueuePtr TaskQueue::append(TaskQueuePtr list, TaskQueuePtr q) { TaskQueuePtr p = list; if (!p) { - return q; + return q; } else { - while(p->next) p = p->next; - p->next = q; - return list; + while(p->next) p = p->next; + p->next = q; + return list; } } +
--- a/TaskManager/kernel/ppe/TaskQueue.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskQueue.h Mon Oct 12 11:27:13 2009 +0900 @@ -2,20 +2,23 @@ #define INCLUDED_TASK_QUEUE #include "base.h" -#include "Task.h" -#include <stdio.h> +class HTask; class TaskQueue { public: - TaskQueue(TaskPtr q = NULL); + TaskQueue(HTask *q = NULL); BASE_NEW_DELETE(TaskQueue); - TaskPtr task; - class TaskQueue *next; + HTask *task; + TaskQueue *waiter; static TaskQueue* append(TaskQueue* list, TaskQueue* q); + + TaskQueue *next; + TaskQueue *prev; + }; typedef TaskQueue* TaskQueuePtr;
--- a/TaskManager/kernel/ppe/TaskQueueInfo.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskQueueInfo.cc Mon Oct 12 11:27:13 2009 +0900 @@ -2,87 +2,193 @@ #include <stdlib.h> #include "TaskQueueInfo.h" -TaskQueueInfo::TaskQueueInfo(void) - :taskQueuePool(NULL), freeTaskQueue(NULL) {} - -TaskQueueInfo::~TaskQueueInfo(void) { destroy(); } +// Singleton TaskQueue Pool +TaskQueueInfo TaskQueueInfo::taskQueuePool; -int -TaskQueueInfo::init(int num) -{ - if (taskQueuePool == NULL) { - return extend_pool(num); +TaskQueueInfo::TaskQueueInfo() { + // 最初の一つは自分 + first = last = this; + next = prev = this; + waiter = NULL; +} + +void +TaskQueueInfo::freePool() { + for(TaskQueuePtr p = taskQueuePool.waiter; p; ) { + TaskQueuePtr next = p->waiter; + p->waiter = NULL; + free(p); + p = next; } - return 0; } int TaskQueueInfo::extend_pool(int num) { - TaskQueuePtr q = NULL; - - q = (TaskQueuePtr)malloc(sizeof(TaskQueue)*(num+1)); + TaskQueuePtr q = (TaskQueuePtr)malloc(sizeof(TaskQueue)*(num+1)); - if (q == NULL) { - return -1; - } - q->next = taskQueuePool; - taskQueuePool = q; + // First Queue is previous pool + q->waiter = waiter; waiter = q; + q++; /* Connect all free queue in the pool */ - for (q = taskQueuePool + 1; --num > 0; q++) { - q->next = q + 1; + TaskQueuePtr p = q; + for (; num-- > 0; p++) { + p->task = NULL; + p->waiter = NULL; + taskQueuePool.addLast(p); } - q->next = freeTaskQueue; - freeTaskQueue = taskQueuePool + 1; return 0; } TaskQueuePtr -TaskQueueInfo::create(TaskPtr task) +TaskQueueInfo::create(HTask *task) { - TaskQueuePtr q; - - if (freeTaskQueue == NULL) { - extend_pool(100); + TaskQueuePtr q = taskQueuePool.poll(); + if (! q) { + taskQueuePool.extend_pool(64); + q = taskQueuePool.poll(); } - q = freeTaskQueue; - freeTaskQueue = freeTaskQueue->next; - + q->next = q->prev = NULL; + q->waiter = NULL; q->task = task; - q->next = NULL; return q; } void -TaskQueueInfo::free(TaskQueuePtr q) +TaskQueueInfo::free_(TaskQueuePtr q) { - q->next = freeTaskQueue; - freeTaskQueue = q; + q->waiter = NULL; + q->task = NULL; + taskQueuePool.addLast(q); } +/*! + TaskQueueInfo は空にならない。最低1個は要素が入っていて + 1個目は特別扱いする。getFirst すると first->next を返す + */ + +/*! + 最初の1個は特別扱いなので、それの後に追加していく + */ void -TaskQueueInfo::destroy(void) +TaskQueueInfo::addFirst(TaskQueue* e) +{ + e->prev = first; + e->next = first->next; + first->next->prev = e; + first->next = e; +} + +void +TaskQueueInfo::addLast(TaskQueue* e) +{ + e->next = first; + e->prev = last; + last->next = e; + last = e; +} + +TaskQueue* +TaskQueueInfo::getFirst() { - TaskQueuePtr q, tmp; + if (empty()) return NULL; + return first->next; +} + +TaskQueue* +TaskQueueInfo::getLast() +{ + if (empty()) return NULL; + return last; +} + +int +TaskQueueInfo::remove(TaskQueue* e) +{ + e->prev->next = e->next; + e->next->prev = e->prev; + + if (first->next == e) { + first->next = e->next; + } + if (last == e) { + last = e->prev; + } + + e->prev = NULL; + e->next = NULL; + + return 1; +} -#if 1 - q = taskQueuePool; - while (q) { - tmp = q->next; - free(q); - q = tmp; +/*! + リストの先頭を取得および削除する。リストが空の場合は NULL を返す。 + */ + +TaskQueue* +TaskQueueInfo::poll() +{ + TaskQueue* e = first->next; + if (e == this) { + return NULL; } -#else - for (q = taskQueuePool; q; q = q->next) { - free(q); + remove(e); + return e; +} + +void +TaskQueueInfo::moveToFirst(TaskQueue* e) +{ + remove(e); + addFirst(e); +} + +/*! + リスト内の指定された位置にある要素を返す。 + 要素数を超えた位置を指定した場合 NULL を返す。 + */ + +TaskQueue* +TaskQueueInfo::get(int index) +{ + TaskQueue* e = first->next; + for (int i = 0; i < index; i++) { + if (e == this) return NULL; + e = e->next; } -#endif - freeTaskQueue = taskQueuePool = NULL; + return e; +} + +TaskQueue* +TaskQueueInfo::find(HTask* task) +{ + TaskQueue* e = first->next; + for(;;) { + if (e == this) return NULL; + if (e->task == task) return e; + e = e->next; + } + return e; +} + +int +TaskQueueInfo::empty() +{ + return next == this; +} + +TaskQueue* +TaskQueueInfo::getNext(TaskQueue* q) +{ + if (q->next==this) return NULL; + return q->next; +} -} + +/* end */
--- a/TaskManager/kernel/ppe/TaskQueueInfo.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskQueueInfo.h Mon Oct 12 11:27:13 2009 +0900 @@ -3,21 +3,43 @@ #include "TaskQueue.h" -class TaskQueueInfo { +class HTask; + +class TaskQueueInfo : public TaskQueue { + + public: /* constructor */ TaskQueueInfo(); - ~TaskQueueInfo(); + + BASE_NEW_DELETE(TaskQueueInfo); /* functions */ - int init(int num); - TaskQueuePtr create(TaskPtr task); - void free(TaskQueuePtr queue); - + TaskQueuePtr create(HTask *task); + void free_(TaskQueuePtr queue); + + void addFirst(TaskQueue* e); + void addLast(TaskQueue* e); + TaskQueue* getFirst(); + TaskQueue* getLast(); + int remove(TaskQueue* e); + TaskQueue* poll(); + void moveToFirst(TaskQueue* e); // or use(); + TaskQueue* get(int index); + TaskQueue* find(HTask *task); + int empty(); + void freePool() ; + + // Iterator + TaskQueue* getNext(TaskQueue* q) ; + int hasNext(TaskQueue* q); + private: /* variables */ - TaskQueuePtr taskQueuePool; - TaskQueuePtr freeTaskQueue; + + static TaskQueueInfo taskQueuePool; + TaskQueue* first; + TaskQueue* last; /* functions */ int extend_pool(int num);
--- a/TaskManager/kernel/schedule/DmaManager.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/schedule/DmaManager.h Mon Oct 12 11:27:13 2009 +0900 @@ -8,8 +8,8 @@ enum dma_tag { DMA_READ = 25, DMA_WRITE = 27, - DMA_READ_IN_LIST = 29, - DMA_READ_OUT_LIST = 30, +// DMA_READ_IN_LIST = 29, +// DMA_READ_OUT_LIST = 30, DMA_READ_TASKLIST = 31, };
--- a/TaskManager/kernel/schedule/SchedTask.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Mon Oct 12 11:27:13 2009 +0900 @@ -39,17 +39,17 @@ SchedTask::SchedTask() { - __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; + 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; this->stdout_ = stdout; this->stderr_ = stderr; this->stdin_ = stdin; @@ -64,26 +64,19 @@ /** * dma_store の wait を行う - * このタスクが RenewTask だった場合、 - * __inListData や __outListData は - * Scheduler の持つ、使い回しの buffer ではなく - * 新たに allocate されたものなので、ここで free する */ SchedTask::~SchedTask() { - if (__flag_renewTask == SCHED_TASK_RENEW) { - free(__inListData); - free(__outListData); - + if (flag_renewTask == SCHED_TASK_RENEW) { /** - * __list != NULL の場合、 - * この Task が __list の最後の Task になるので (SchedTask::next 参照) - * このタイミングで __list を解放する + * list != NULL の場合、 + * この Task が list の最後の Task になるので (SchedTask::next 参照) + * このタイミングで list を解放する * (free に渡されるアドレスが正しいものとなる)。 * それ以外の Task では当然解放しない。 - * __list == NULL なので、free に渡しても無問題 + * list == NULL なので、free に渡しても無問題 */ - free(__list); + free(list); } @@ -93,9 +86,9 @@ * このタスクを Renew Task とし、それに応じた関数をセットする */ void -SchedTask::__setRenew() +SchedTask::setRenew() { - __flag_renewTask = SCHED_TASK_RENEW; + flag_renewTask = SCHED_TASK_RENEW; ex_init = &SchedTask::ex_init_renew; ex_read = &SchedTask::ex_read_renew; @@ -105,17 +98,18 @@ } void -SchedTask::__init__(TaskListPtr _list, TaskPtr _task, int index, - ListDataPtr rbuf, ListDataPtr wbuf, Scheduler* sc) +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; + list = _list; + task = _task; + inListData = &_task->inData; + outListData = &_task->outData; + scheduler = sc; + cur_index = index; - __scheduler->mainMem_wait(); + scheduler->mainMem_wait(); (this->*ex_init)(); } @@ -126,17 +120,21 @@ void SchedTask::ex_init_normal() { - __scheduler->dma_load(__inListData, (uint32)__task->inData, +#if 0 + // task list に入れたので既に読んでいる? + // + scheduler->dma_load(inListData, (uint32)&task->inData, sizeof(ListData), DMA_READ_IN_LIST); - __scheduler->dma_load(__outListData, (uint32)__task->outData, + 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); + scheduler->dma_wait(DMA_READ_IN_LIST); + scheduler->dma_wait(DMA_READ_OUT_LIST); +#endif #endif - __taskGroup = new TaskGroup; - __taskGroup->command = __task->self; + taskGroup = new TaskGroup; + taskGroup->command = (int)task->self; } /** @@ -147,12 +145,20 @@ void SchedTask::ex_init_renew() { - __inListData = __task->inData; - __outListData = __task->outData; - __taskGroup = (TaskGroupPtr)__task->self; + inListData = &task->inData; + outListData = &task->outData; + taskGroup = (TaskGroupPtr)task->self; +} + +void +SchedTask::read() +{ + (this->*ex_read)(); } /** + * PPE 内で生成されたタスクの ex_read() + * * [Todo] * データの読み込み場所を readbuf ではなく、 * ユーザ自身で決めれるようになるといいかもしれない。 @@ -162,29 +168,30 @@ * # もちろん管理はユーザに任せるわけだ。 */ void -SchedTask::read() +SchedTask::ex_read_normal() { __debug("[SchedTask:%s]\n", __FUNCTION__); +#if 0 #if !defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_READ_IN_LIST); - __scheduler->dma_wait(DMA_READ_OUT_LIST); + scheduler->dma_wait(DMA_READ_IN_LIST); + scheduler->dma_wait(DMA_READ_OUT_LIST); +#endif #endif - __writebuf = __scheduler->allocate(__outListData->size); + writebuf = scheduler->allocate(outListData->size); // 読むデータが一つもなければ無視 - if (__inListData->length == 0) return; + if (inListData->length == 0) return; // load Input Data - __readbuf = __scheduler->allocate(__inListData->size); - __scheduler->dma_loadList(__inListData, __readbuf, DMA_READ); + readbuf = scheduler->allocate(inListData->size); + scheduler->dma_loadList(inListData, readbuf, DMA_READ); #if defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_READ); + scheduler->dma_wait(DMA_READ); #endif - (this->*ex_read)(); } void @@ -193,28 +200,28 @@ __debug("[SchedTask:%s]\n", __FUNCTION__); #if !defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_READ); - task_list[__task->command].wait(__scheduler,__task->command); + scheduler->dma_wait(DMA_READ); + task_list[task->command].wait(scheduler,task->command); #endif - task_list[__task->command].run(this, __readbuf, __writebuf); + task_list[task->command].run(this, readbuf, writebuf); - free(__readbuf); + free(readbuf); - if (__taskGroup->status() != 0) { - __task->self = __taskGroup->command; - delete __taskGroup; - __taskGroup = NULL; + if (taskGroup->status() != 0) { + task->self = (int)taskGroup->command; + delete taskGroup; + taskGroup = NULL; } // 書き込む領域がなければ無視 - if (__outListData->length > 0) { - __scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE); + if (outListData->length > 0) { + scheduler->dma_storeList(outListData, writebuf, DMA_WRITE); #if defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_WRITE); - free(__writebuf); + scheduler->dma_wait(DMA_WRITE); + free(writebuf); #endif } @@ -227,22 +234,15 @@ __debug("[SchedTask:%s]\n", __FUNCTION__); #if !defined(NO_PIPELINE) - __scheduler->dma_wait(DMA_WRITE); - free(__writebuf); + scheduler->dma_wait(DMA_WRITE); + free(writebuf); #endif - if (__task->self == MY_SPE_NOP) return; + if ((int)task->self == MY_SPE_NOP) return; (this->*ex_write)(); } -/** - * PPE 内で生成されたタスクの ex_read() - */ -void -SchedTask::ex_read_normal() -{ -} /** * SPE 内で生成されたタスクの ex_read() @@ -250,6 +250,7 @@ void SchedTask::ex_read_renew() { + writebuf = scheduler->allocate(outListData->size); } /** @@ -284,8 +285,8 @@ * このタスク内で新たにタスクが生成されなかった * or 生成されたが、そのタスクの終了を待つ必要は無い */ - if (__renew_flag == 0) { - __scheduler->mail_write(__task->self); + if (renew_flag == 0) { + scheduler->mail_write((int)task->self); } } @@ -306,13 +307,13 @@ { uint32 cmd; - __taskGroup->remove(__task); - cmd = __taskGroup->status(); + taskGroup->remove(task); + cmd = taskGroup->status(); // タスク内で作られた全てのタスクが終了した if (cmd != 0) { - delete __taskGroup; - __scheduler->mail_write(cmd); + delete taskGroup; + scheduler->mail_write(cmd); } } @@ -329,36 +330,36 @@ SchedTaskBase* SchedTask::ex_next_normal() { - if (__cur_index < __list->length) { + if (cur_index < list->length) { SchedTaskBase *nextSched; - nextSched = __scheduler->get_nextRenewTaskList(); + nextSched = scheduler->get_nextRenewTaskList(); // RenewTask がある if (nextSched) { - __scheduler->set_backupTaskList(__list); - __scheduler->set_backupTaskListIndex(__cur_index); + scheduler->set_backupTaskList(list); + scheduler->set_backupTaskListIndex(cur_index); return nextSched; } else { - TaskPtr nextTask = &__list->tasks[__cur_index++]; - if (__cur_index < __list->length) { + TaskPtr nextTask = &list->tasks[cur_index++]; + if (cur_index < list->length) { // load next task - loadSchedTask(__scheduler, &__list->tasks[__cur_index]); + loadSchedTask(scheduler, &list->tasks[cur_index]); } - nextSched = createSchedTask(__scheduler, nextTask); - ((SchedTask*)nextSched)->__init__(__list, nextTask, __cur_index, - __scheduler->get_curReadBuf(), - __scheduler->get_curWriteBuf(), - __scheduler); + nextSched = createSchedTask(scheduler, nextTask); + ((SchedTask*)nextSched)->init(list, nextTask, cur_index, + // scheduler->get_curReadBuf(), + // scheduler->get_curWriteBuf(), + scheduler); return nextSched; } } else { - uint32 nextList = (uint32)__list->next; + uint32 nextList = (uint32)list->next; if (nextList == 0) { - return new SchedNop2Ready(__scheduler); + return new SchedNop2Ready(scheduler); } else { - return createSchedTaskList(nextList, __scheduler, + return createSchedTaskList(nextList, scheduler, SCHED_TASKLIST_NORMAL); } } @@ -373,54 +374,54 @@ TaskPtr nextTask; SchedTask *nextSched; - if (__cur_index < __list->length) { - nextTask = &__list->tasks[__cur_index++]; - if (__cur_index < __list->length) { + if (cur_index < list->length) { + nextTask = &list->tasks[cur_index++]; + if (cur_index < list->length) { // load next task - loadSchedTask(__scheduler, &__list->tasks[__cur_index]); + loadSchedTask(scheduler, &list->tasks[cur_index]); } - nextSched = createSchedTask(__scheduler, nextTask); + nextSched = createSchedTask(scheduler, nextTask); // RenewTaskList を実行中なので - nextSched->__setRenew(); - nextSched->__init__(__list, nextTask, __cur_index, - __scheduler->get_curReadBuf(), - __scheduler->get_curWriteBuf(), - __scheduler); + nextSched->setRenew(); + nextSched->init(list, nextTask, cur_index, + // scheduler->get_curReadBuf(), + // scheduler->get_curWriteBuf(), + scheduler); /** * この理由は SchedTask:~SchedTask() で */ - __list = NULL; + list = NULL; return nextSched; } else { SchedTaskBase *nextList; - nextList = __scheduler->get_nextRenewTaskList(); + nextList = scheduler->get_nextRenewTaskList(); if (nextList) { return nextList; } else { - TaskListPtr nextList = __scheduler->get_backupTaskList(); + TaskListPtr nextList = scheduler->get_backupTaskList(); // 中断した TaskList がある if (nextList) { - __cur_index = __scheduler->get_backupTaskListIndex(); + cur_index = scheduler->get_backupTaskListIndex(); - nextTask = &nextList->tasks[__cur_index++]; - if (__cur_index < __list->length) { + nextTask = &nextList->tasks[cur_index++]; + if (cur_index < list->length) { // load next task - loadSchedTask(__scheduler, &__list->tasks[__cur_index]); + loadSchedTask(scheduler, &list->tasks[cur_index]); } - nextSched = createSchedTask(__scheduler, nextTask); + nextSched = createSchedTask(scheduler, nextTask); - nextSched->__init__(nextList, nextTask, __cur_index, - __scheduler->get_curReadBuf(), - __scheduler->get_curWriteBuf(), - __scheduler); + nextSched->init(nextList, nextTask, cur_index, + // scheduler->get_curReadBuf(), + // scheduler->get_curWriteBuf(), + scheduler); return nextSched; } else { - return new SchedNop2Ready(__scheduler); + return new SchedNop2Ready(scheduler); } } } @@ -429,7 +430,7 @@ int SchedTask::get_cpuid() { - return __scheduler->id; + return scheduler->id; } /** @@ -440,7 +441,7 @@ SchedTask::get_input(void *buff, int index) { if (buff != NULL) { - return (void*)((int)buff + __inListData->bound[index]); + return (void*)((int)buff + inListData->bound[index]); } else { return NULL; } @@ -452,7 +453,7 @@ uint32 SchedTask::get_inputAddr(int index) { - return __inListData->element[index].addr; + return inListData->element[index].addr; } /** @@ -461,7 +462,7 @@ int SchedTask::get_inputSize(int index) { - return __inListData->element[index].size; + return inListData->element[index].size; } /** @@ -471,7 +472,7 @@ SchedTask::get_output(void *buff, int index) { if (buff != NULL) { - return (void*)((int)buff + __outListData->bound[index]); + return (void*)((int)buff + outListData->bound[index]); } else { return NULL; } @@ -483,7 +484,7 @@ uint32 SchedTask::get_outputAddr(int index) { - return __outListData->element[index].addr; + return outListData->element[index].addr; } /** @@ -492,126 +493,125 @@ int SchedTask::get_outputSize(int index) { - return __outListData->element[index].size; + return outListData->element[index].size; } int SchedTask::get_param(int index) { - return __task->param[index]; + return task->param[index]; } TaskPtr SchedTask::create_task(int cmd) { - TaskListPtr taskList = __scheduler->get_renewListBuf(); + 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)); + // already allocated + // p->inData = (ListData*)scheduler->allocate(sizeof(ListData)); + // p->outData = (ListData*)scheduler->allocate(sizeof(ListData)); - p->inData->clear(); - p->outData->clear(); + p->inData.clear(); + p->outData.clear(); - p->self = MY_SPE_NOP; + p->self = (int)MY_SPE_NOP; p->param_size = 0; return p; } /** - * 生成したタスクが終了してから、メインスケジューラ(PPE) に - * タスクが終了した旨を知らせる。 * - * @param[in] waitTask タスク内で生成したタスク + * @param[in] waitTask タスク内で生成したタスクの登録(spawn()に相当) */ void SchedTask::wait_task(TaskPtr waitTask) { - waitTask->self = (uint32)__taskGroup; + waitTask->self = (int)taskGroup; - __scheduler->add_groupTask(__taskGroup, waitTask); + scheduler->add_groupTask(taskGroup, waitTask); - __renew_flag++; + renew_flag++; } void* SchedTask::global_alloc(int id, int size) { - return __scheduler->global_alloc(id, size); + return scheduler->global_alloc(id, size); } void* SchedTask::global_get(int id) { - return __scheduler->global_get(id); + return scheduler->global_get(id); } void SchedTask::global_set(int id, void *addr) { - __scheduler->global_set(id, addr); + scheduler->global_set(id, addr); } void SchedTask::global_free(int id) { - __scheduler->global_free(id); + scheduler->global_free(id); } MemList* SchedTask::createMemList(int size, int count) { - return __scheduler->createMemList(size, count); + return scheduler->createMemList(size, count); } void SchedTask::mainMem_alloc(int id, int size) { - __scheduler->mainMem_alloc(id, size); + scheduler->mainMem_alloc(id, size); } void SchedTask::mainMem_wait() { - __scheduler->mainMem_wait(); + scheduler->mainMem_wait(); } void* SchedTask::mainMem_get(int id) { - return __scheduler->mainMem_get(id); + return scheduler->mainMem_get(id); } void* SchedTask::allocate(int size) { - return __scheduler->allocate(size); + return scheduler->allocate(size); } void SchedTask::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) { - __scheduler->dma_load(buf, addr, size, 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); + scheduler->dma_store(buf, addr, size, mask); } void SchedTask::dma_wait(uint32 mask) { - __scheduler->dma_wait(mask); + scheduler->dma_wait(mask); } void SchedTask::show_dma_wait() { - __scheduler->show_dma_wait(); + scheduler->show_dma_wait(); } MemorySegment * SchedTask::get_segment(memaddr addr, MemList *m) { - return __scheduler->get_segment(addr,m); + return scheduler->get_segment(addr,m); } void SchedTask::put_segment(MemorySegment *s) { - __scheduler->put_segment(s); + scheduler->put_segment(s); } void SchedTask::wait_segment(MemorySegment *s) { - __scheduler->wait_segment(s); + scheduler->wait_segment(s); } /* system call */
--- a/TaskManager/kernel/schedule/SchedTask.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Mon Oct 12 11:27:13 2009 +0900 @@ -22,15 +22,15 @@ /* variables */ // Task を実行するスケジューラ自身 - Scheduler *__scheduler; + Scheduler *scheduler; // 現在スケジューラが実行している TaskList と、このタスクに対応する Task - TaskListPtr __list; - TaskPtr __task; + TaskListPtr list; + TaskPtr task; // read/write 用の ListData - ListDataPtr __inListData; - ListDataPtr __outListData; + ListDataPtr inListData; + ListDataPtr outListData; /** * read データ、write 用のバッファ @@ -38,24 +38,24 @@ * writebuf にデータを描き込んでおくと、 * タスク登録時に設定した出力先に書き込む */ - void *__readbuf; - void *__writebuf; + void *readbuf; + void *writebuf; // Task の、Tasklist での位置。(task = &list[cur_index-1]) - int __cur_index; + int cur_index; // タスク内で生成されたタスクのグループ - TaskGroup *__taskGroup; + TaskGroup *taskGroup; // このタスク内で生成されたタスクの数 - int __renew_flag; + int renew_flag; // このタスクが SPE 内で生成されたタスクか否か 1: Yes, 0: No - int __flag_renewTask; + int flag_renewTask; // タスクがメインメモリ側で生成されたものか、 // SPE で生成されたものかによって、データの扱いが変わってくる。 - // そのために if (__flag_renewTask) を連発するのはよくないので + // そのために if (flag_renewTask) を連発するのはよくないので // 関数ポインタで持っておく void (SchedTask::*ex_init)(); void (SchedTask::*ex_read)(); @@ -78,7 +78,7 @@ /** * PPE で生成されたタスクに対する - * __init__, read,exec,write,next の付属(?)処理 + * init, read,exec,write,next の付属(?)処理 */ void ex_init_normal(); void ex_read_normal(); @@ -88,7 +88,7 @@ /** * SPE で生成されたタスクに対する - * __inti__, ead,exec,write,next の付属(?)処理 + * inti, ead,exec,write,next の付属(?)処理 */ void ex_init_renew(); void ex_read_renew(); @@ -99,9 +99,10 @@ public: /* functions */ - void __setRenew(); - void __init__(TaskListPtr _list, TaskPtr _task, int index, - ListDataPtr rbuf, ListDataPtr wbuf, Scheduler* sc); + void setRenew(); + void init(TaskListPtr _list, TaskPtr _task, int index, + // ListDataPtr rbuf, ListDataPtr wbuf, + Scheduler* sc); //--- User API --- int get_cpuid(); @@ -136,7 +137,7 @@ void *allocate(int size); void free_(void *p) { - __scheduler->free_(p); + scheduler->free_(p); } void dma_load(void *buf, uint32 addr, uint32 size, uint32 mask); @@ -149,11 +150,11 @@ */ void* get_input(int index) { - return get_input(__readbuf, index); + return get_input(readbuf, index); } void* get_output(int index) { - return get_output(__writebuf, index); + return get_output(writebuf, index); } /* system call */
--- a/TaskManager/kernel/schedule/SchedTaskList.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskList.cc Mon Oct 12 11:27:13 2009 +0900 @@ -77,12 +77,12 @@ nextSched = createSchedTask(scheduler, nextTask); if (flag_renewTaskList == SCHED_TASKLIST_RENEW) { - ((SchedTask*)nextSched)->__setRenew(); + ((SchedTask*)nextSched)->setRenew(); } - ((SchedTask*)nextSched)->__init__(list, nextTask, 1, - scheduler->get_curReadBuf(), - scheduler->get_curWriteBuf(), + ((SchedTask*)nextSched)->init(list, nextTask, 1, + // scheduler->get_curReadBuf(), + // scheduler->get_curWriteBuf(), scheduler); }
--- a/TaskManager/kernel/schedule/Scheduler.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Mon Oct 12 11:27:13 2009 +0900 @@ -12,7 +12,7 @@ Scheduler::TaskObject task_list[MAX_TASK_OBJECT]; -Scheduler::~Scheduler(void) +Scheduler::~Scheduler() { delete connector; } @@ -21,20 +21,20 @@ */ void -Scheduler::init(void) +Scheduler::init() { hash = 0; 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)); + // buff_inListData[i] = (ListDataPtr)allocate(sizeof(ListData)); + // buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData)); } buffFlag_taskList = 0; - buffFlag_inListData = 0; - buffFlag_outListData = 0; + // buffFlag_inListData = 0; + // buffFlag_outListData = 0; flag_renewTaskList = 0; // bzero でもいいけど @@ -50,10 +50,11 @@ taskGroup = new TaskGroup; renewTop_taskList = NULL; renewCur_taskList = NULL; + bak_curTaskList = NULL; } void -Scheduler::run(void) +Scheduler::run() { task1 = new SchedNop(); task2 = new SchedNop(); @@ -78,14 +79,14 @@ void -Scheduler::finish(void) +Scheduler::finish() { free(buff_taskList[0]); free(buff_taskList[1]); - free(buff_inListData[0]); - free(buff_inListData[1]); - free(buff_outListData[0]); - free(buff_outListData[1]); + // free(buff_inListData[0]); + // free(buff_inListData[1]); + // free(buff_outListData[0]); + // free(buff_outListData[1]); } /** @@ -93,7 +94,7 @@ * パイプラインの各処理が交代して使う。 */ TaskListPtr -Scheduler::get_curListBuf(void) +Scheduler::get_curListBuf() { buffFlag_taskList ^= 1; @@ -102,11 +103,15 @@ /** + * Task に inListData, outListData を入れたので、 + * これは必要ないらしい。 + * * あらかじめ memory allocte してある ListData の領域を * パイプラインの各処理が交代して使う。 */ +#if 0 ListDataPtr -Scheduler::get_curWriteBuf(void) +Scheduler::get_curWriteBuf() { buffFlag_outListData ^= 1; return buff_outListData[buffFlag_outListData]; @@ -114,11 +119,12 @@ ListDataPtr -Scheduler::get_curReadBuf(void) +Scheduler::get_curReadBuf() { buffFlag_inListData ^= 1; return buff_inListData[buffFlag_inListData]; } +#endif /** * タスク内で生成されたタスクを格納する TaskList を取得する @@ -130,7 +136,7 @@ * 以上の場合です */ TaskListPtr -Scheduler::get_renewListBuf(void) +Scheduler::get_renewListBuf() { if (renewCur_taskList && renewCur_taskList->length < TASK_MAX_SIZE) { return renewCur_taskList; @@ -153,7 +159,7 @@ * @return next RenewTaskList */ SchedTaskList* -Scheduler::get_nextRenewTaskList(void) +Scheduler::get_nextRenewTaskList() { if (renewTop_taskList) { TaskListPtr list = renewTop_taskList; @@ -188,7 +194,7 @@ * @return TaskList */ TaskListPtr -Scheduler::get_backupTaskList(void) +Scheduler::get_backupTaskList() { TaskListPtr ret = bak_curTaskList; @@ -197,7 +203,7 @@ } int -Scheduler::get_backupTaskListIndex(void) +Scheduler::get_backupTaskListIndex() { int ret = bakIndex_taskList; @@ -243,7 +249,7 @@ } uint32 -Scheduler::mail_read(void) +Scheduler::mail_read() { return connector->mail_read(); } @@ -272,7 +278,7 @@ } void -Scheduler::reload_groupTask(void) +Scheduler::reload_groupTask() { taskGroup = new TaskGroup; }
--- a/TaskManager/kernel/schedule/Scheduler.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.h Mon Oct 12 11:27:13 2009 +0900 @@ -35,12 +35,12 @@ // double buffering TaskListPtr buff_taskList[2]; - ListDataPtr buff_inListData[2]; - ListDataPtr buff_outListData[2]; + // ListDataPtr buff_inListData[2]; + // ListDataPtr buff_outListData[2]; int buffFlag_taskList; - int buffFlag_inListData; - int buffFlag_outListData; + // int buffFlag_inListData; + // int buffFlag_outListData; /* TaskList 関連 */ @@ -121,8 +121,8 @@ void finish(); TaskListPtr get_curListBuf(); - ListDataPtr get_curReadBuf(); - ListDataPtr get_curWriteBuf(); + // ListDataPtr get_curReadBuf(); + // ListDataPtr get_curWriteBuf(); TaskListPtr get_renewListBuf(); void set_backupTaskList(TaskListPtr cur_taskList);
--- a/TaskManager/kernel/schedule/TaskGroup.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/schedule/TaskGroup.cc Mon Oct 12 11:27:13 2009 +0900 @@ -1,21 +1,24 @@ #include "TaskGroup.h" +#include <stdlib.h> void TaskGroup::add(TaskPtr add_task) { - TaskQueuePtr q = new TaskQueue(add_task); - group = TaskQueue::append(group, q); + struct groupQueue *q = (struct groupQueue *)malloc(sizeof(struct groupQueue)); + q->next = group; + q->task = add_task; + group = q; } void TaskGroup::remove(TaskPtr delete_task) { - TaskQueuePtr p = group; - TaskQueuePtr p1; + struct groupQueue * p = group; + struct groupQueue * p1; if (p == NULL) return; if (p->task == delete_task) { group = group->next; - delete p; + free( p); } else { p1 = p->next; while (p1 && p1->task != delete_task) { @@ -24,7 +27,7 @@ } if (p1) { p->next = p1->next; - delete p1; + free( p1); } } } @@ -36,7 +39,7 @@ * command を返す。 */ unsigned int -TaskGroup::status(void) { +TaskGroup::status() { /** * bool の * true == 1;
--- a/TaskManager/kernel/schedule/TaskGroup.h Mon Oct 12 11:26:17 2009 +0900 +++ b/TaskManager/kernel/schedule/TaskGroup.h Mon Oct 12 11:27:13 2009 +0900 @@ -2,16 +2,23 @@ #define INCLUDED_TASK_GROUP #include "base.h" -#include "TaskQueue.h" +#include "Task.h" class TaskGroup { public: - TaskGroup(void): group(NULL) {} + + struct groupQueue { + struct groupQueue *next; + TaskPtr task; + } *group; + + TaskGroup(): group(NULL) {} BASE_NEW_DELETE(TaskGroup); + // この command を引き渡すだけのためのオブジェクトらしい + unsigned int command; - TaskQueuePtr group; /** * 待つ Task を追加 @@ -28,7 +35,7 @@ * PPE に送るべきコマンドを返す。 * まだ待つべきタスクがある場合は 0 を返す */ - unsigned int status(void); + unsigned int status(); }; typedef TaskGroup* TaskGroupPtr;
--- a/example/dependency_task/main.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/example/dependency_task/main.cc Mon Oct 12 11:27:13 2009 +0900 @@ -16,7 +16,7 @@ void run_start(TaskManager *manager) { - HTaskPtr t_exec; + HTaskPtr t_exec[2]; HTaskPtr t_print; idata = (int*)manager->allocate(sizeof(int)*length*2); @@ -31,21 +31,23 @@ // idata を二つに分けて計算する for (int i = 0; i < 2; i++) { - t_exec = manager->create_task(TASK_EXEC); - t_exec->add_inData(&idata[length*i], sizeof(int)*length); - t_exec->add_outData(&idata[length*i], sizeof(int)*length); - t_exec->add_param(length); - t_exec->add_param(13*(i+1)); - t_exec->set_cpu(SPE_ANY); + t_exec[i] = manager->create_task(TASK_EXEC); + t_exec[i]->add_inData(&idata[length*i], sizeof(int)*length); + t_exec[i]->add_outData(&idata[length*i], sizeof(int)*length); + t_exec[i]->add_param(length); + t_exec[i]->add_param(13*(i+1)); + t_exec[i]->set_cpu(SPE_ANY); if (depend_flg) - t_print->wait_for(t_exec); - - t_exec->spawn(); + t_print->wait_for(t_exec[i]); } // add Active Queue t_print->spawn(); + + for (int i = 0; i < 2; i++) { + t_exec[i]->spawn(); + } } int
--- a/example/renew_task/Func.h Mon Oct 12 11:26:17 2009 +0900 +++ b/example/renew_task/Func.h Mon Oct 12 11:27:13 2009 +0900 @@ -1,5 +1,6 @@ enum { RENEW_START = 0, + RENEW_REPEAT, RENEW1, RENEW2, RENEW3,
--- a/example/renew_task/main.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/example/renew_task/main.cc Mon Oct 12 11:27:13 2009 +0900 @@ -8,24 +8,70 @@ const char *usr_help_str = "Usage: ./renew_task"; +SchedDefineTask(RenewRepeat); + +static int count = 1; +static int task_count = 1; + +static void +renewRepeat(void *arg) +{ + TaskManager *manager = (TaskManager *)arg; + + if (count-->0) { + HTask *repeat = manager->create_task(RENEW_REPEAT); + repeat->set_post(renewRepeat, (void*)manager); + repeat->spawn(); + + HTask *renew; + + printf("[PPE] Create Task : RenewStart\n\n"); + + for(int i=0;i<task_count;i++) { + renew = manager->create_task(RENEW_START); + renew->set_cpu(SPE_ANY); + renew->add_param(i); + + // add Active Queue + renew->spawn(); + } + } +} + +static int +run(SchedTask *s, void *rbuf, void *wbuf) +{ + // RewnewRepeat Task + return 0; +} + static int init(int argc, char **argv) { + for (int i = 1; argv[i]; ++i) { + if (strcmp(argv[i], "-count") == 0) { + count = atoi(argv[++i]); + } else if (strcmp(argv[i], "-task") == 0) { + task_count = atoi(argv[++i]); + } + + + } return 0; } static void renew_init(TaskManager *manager) { - HTask *renew; + HTask *repeat; - printf("[PPE] Create Task : RenewStart\n\n"); + printf("[PPE] Create Task : RenewRepeat\n\n"); - renew = manager->create_task(RENEW_START); - renew->set_cpu(SPE_ANY); + repeat = manager->create_task(RENEW_REPEAT); + repeat->set_post(renewRepeat, (void*)manager); // add Active Queue - renew->spawn(); + repeat->spawn(); } int
--- a/example/renew_task/ppe/RenewStart.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/example/renew_task/ppe/RenewStart.cc Mon Oct 12 11:27:13 2009 +0900 @@ -5,10 +5,14 @@ /* これは必須 */ SchedDefineTask(RenewStart); + static int run(SchedTask *s, void *rbuf, void *wbuf) { - s->printf("[PPE] ** running RenewStart\n"); + int id; + id = s->get_param(0); + + s->printf("[PPE] ** running RenewStart %d\n", id); s->printf("[PPE] Create Task : Renew1\n"); TaskPtr nextTask = s->create_task(RENEW1);
--- a/example/renew_task/ppe/task_init.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/example/renew_task/ppe/task_init.cc Mon Oct 12 11:27:13 2009 +0900 @@ -2,6 +2,7 @@ #include "Scheduler.h" /* 必ずこの位置に書いて */ +SchedExternTask(RenewRepeat); SchedExternTask(RenewStart); SchedExternTask(Renew1); SchedExternTask(Renew2); @@ -18,6 +19,7 @@ task_init(void) { SchedRegisterTask(RENEW_START, RenewStart); + SchedRegisterTask(RENEW_REPEAT, RenewRepeat); SchedRegisterTask(RENEW1, Renew1); SchedRegisterTask(RENEW2, Renew2); SchedRegisterTask(RENEW3, Renew3);
--- a/example/renew_task/spe/Renew1.cc Mon Oct 12 11:26:17 2009 +0900 +++ b/example/renew_task/spe/Renew1.cc Mon Oct 12 11:27:13 2009 +0900 @@ -13,7 +13,7 @@ profile->ProfStop(); profile->ProfPrint(); - int *test_num = (int *)s->get_input(0); + int *test_num = (int *)s->get_input(rbuf,0); s->printf("[SPE] test_num = %d\n", *test_num); s->printf("[SPE] ** running Renew1\n");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/Func.h Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,5 @@ +enum { + HELLO_TASK, + RUN_FINISH, +}; +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/Makefile Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,20 @@ +default: macosx + +macosx: FORCE + @echo "Make for Mac OS X" + @$(MAKE) -f Makefile.macosx + +linux: FORCE + @echo "Make for Linux" + @$(MAKE) -f Makefile.linux + +cell: FORCE + @echo "Make for PS3 (Cell)" + @$(MAKE) -f Makefile.cell + +FORCE: + +clean: + @$(MAKE) -f Makefile.macosx clean + @$(MAKE) -f Makefile.linux clean + @$(MAKE) -f Makefile.cell clean \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/Makefile.cell Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,42 @@ +include ./Makefile.def + +SRCS_TMP = $(wildcard *.cc) +SRCS_EXCLUDE = # ե +SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) +OBJS = $(SRCS:.cc=.o) + +TASK_DIR = ppe +TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc) +TASK_SRCS_EXCLUDE = +TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP)) +TASK_OBJS = $(TASK_SRCS:.cc=.o) + +LIBS += -lCellManager -lspe2 -lpthread -Wl,--gc-sections + +.SUFFIXES: .cc .o + +.cc.o: + $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +all: $(TARGET) speobject + +$(TARGET): $(OBJS) $(TASK_OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) + +speobject: + cd spe; $(MAKE) + +run: + ./$(TARGET) -cpu 6 + +link: + $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) + +debug: $(TARGET) + sudo ppu-gdb ./$(TARGET) + +clean: + rm -f $(TARGET) $(OBJS) $(TASK_OBJS) + rm -f *~ \#* + rm -f ppe/*~ ppe/\#* + cd spe; $(MAKE) clean
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/Makefile.def Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,14 @@ +TARGET = task_queue + +# include/library path +# ex: macosx +#CERIUM = /Users/gongo/Source/Cerium + +# ex: linux/ps3 +CERIUM = ../../../Cerium + +CC = g++ +CFLAGS = -g -Wall -O9 + +INCLUDE = -I${CERIUM}/include/TaskManager -I. -I.. +LIBS = -L${CERIUM}/TaskManager
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/Makefile.linux Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,36 @@ +include ./Makefile.def + +SRCS_TMP = $(wildcard *.cc) +SRCS_EXCLUDE = # ե +SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) +OBJS = $(SRCS:.cc=.o) + +TASK_DIR = ppe +TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc) +TASK_SRCS_EXCLUDE = +TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP)) +TASK_OBJS = $(TASK_SRCS:.cc=.o) + +LIBS += -lFifoManager + +.SUFFIXES: .cc .o + +.cc.o: + $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +all: $(TARGET) + +$(TARGET): $(OBJS) $(TASK_OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) + +link: + $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) + +debug: $(TARGET) + sudo gdb ./$(TARGET) + +clean: + rm -f $(TARGET) $(OBJS) $(TASK_OBJS) + rm -f *~ \#* + rm -f ppe/*~ ppe/\#* + rm -f spe/*~ spe/\#*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/Makefile.macosx Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,36 @@ +include ./Makefile.def + +SRCS_TMP = $(wildcard *.cc) +SRCS_EXCLUDE = # ե +SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) +OBJS = $(SRCS:.cc=.o) + +TASK_DIR = ppe +TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc) +TASK_SRCS_EXCLUDE = +TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP)) +TASK_OBJS = $(TASK_SRCS:.cc=.o) + +LIBS += -lFifoManager `sdl-config --libs` + +.SUFFIXES: .cc .o + +.cc.o: + $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +all: $(TARGET) + +$(TARGET): $(OBJS) $(TASK_OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) + +link: + $(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS) + +debug: $(TARGET) + sudo gdb ./$(TARGET) + +clean: + rm -f $(TARGET) $(OBJS) $(TASK_OBJS) + rm -f *~ \#* + rm -f ppe/*~ ppe/\#* + rm -f spe/*~ spe/\#*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/README Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,4 @@ +Tue Oct 6 17:17:09 JST 2009 + +TaskQueueu は、本来、内部で使う double linked list なので、 +ユーザには関係ない。ここでテストするのは変だが。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/main.cc Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,114 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "TaskManager.h" +#include "Func.h" +#include "main.h" + +extern void task_init(void); + +static int count = 1; + +extern TaskManager *manager; + +const char *usr_help_str = "Usage: ./hello [-cpu spe_num] [-count N]\n\ + -cpu Number of SPE (default 1) \n\ + -count Number of task is print \"Hello, World!!\""; + +int +init(int argc, char **argv) +{ + for (int i = 1; argv[i]; ++i) { + if (strcmp(argv[i], "-count") == 0) { + count = atoi(argv[++i]); + } + + } + + return 0; +} + +Queues queues; + +static void +repeat(void *arg) +{ + static int count = 4; + QueuePtr q = (QueuePtr) arg; + TaskManager *manager = q->m; + + if (count-->0) { + HTask *t = manager->create_task(HELLO_TASK); + t->set_post(repeat, arg); + t->add_param(q->i); + t->add_param((int)arg); + t->spawn(); + + printf("[PPE] Create Task : Hello count=%d id=%d\n\n",count, q->i); + } else { + printf("[PPE] End Task : Hello id=%d\n\n", q->i); + } +} + +void +hello_init(TaskManager *manager) +{ + + if (count >MAX_QUEUE) return; + + queues.m = manager; + queues.i = 0; + for (int i = 0; i < MAX_QUEUE; i++) { + TaskQueueInfo *q = new TaskQueueInfo() ; + queues.q[i] = q; + } + + for (int i = 0; i < count; i++) { + /** + * Create Task + * create_task(Task ID); + */ + HTask *hello = manager->create_task(HELLO_TASK); + + /** + * Select CPU + * SPE_0, SPE_1, SPE_2, SPE_3, SPE_4, SPE_5, SPE_ANY + * if you do not call this, execute PPE. + */ + hello->set_cpu(SPE_ANY); + + /** + * Set 32bits parameter + * add_param(32bit parameter); + */ + QueuePtr q = (QueuePtr) manager->allocate(sizeof(Queues)); + + q->i = i; + q->m = manager; + for (int j = 0; j < MAX_QUEUE; j++) { + q->q[j] = queues.q[j]; + } + + hello->add_param(i); + hello->add_param((int)&queues); + hello->set_post(repeat, (void*) &queues); + + hello->spawn(); + } +} + +int +TMmain(TaskManager *manager, int argc, char *argv[]) +{ + if (init(argc, argv) < 0) { + return -1; + } + + // Task Register + // ppe/task_init.cc + task_init(); + + hello_init(manager); + + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/main.h Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,11 @@ +#include "TaskQueueInfo.h" +#include "TaskManager.h" + +#define MAX_QUEUE 4 + +typedef struct queues { + int i; + int j; + TaskManager *m; + TaskQueueInfo *q[MAX_QUEUE]; +} Queues, *QueuePtr;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/ppe/.#Hello.cc Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,1 @@ +e065746@nakasone-hiroki-no-macbook.local.1456 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/ppe/Hello.cc Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,56 @@ +#include <stdio.h> +#include "SchedTask.h" +#include "Hello.h" +#include "Func.h" +#include "main.h" + +/* これは必須 */ +SchedDefineTask(Hello); + + + +static int +run(SchedTask *smanager, void *rbuf, void *wbuf) +{ + int task_id = smanager->get_param(0); + QueuePtr q = (QueuePtr) smanager->get_param(1); + + smanager->printf("[%d] Hello, World!!\n", task_id); + + for(int i=0;i<100;i++) { + TaskQueueInfo *i0 = q->q[i%MAX_QUEUE]; + TaskQueueInfo *i1 = q->q[(i+1)%MAX_QUEUE]; + TaskQueue *q0; + TaskQueue *q1; + + switch(q->m->get_random() % 4) { + case 0: + q0 = i0->create(0); + q1 = i1->create(0); + i1->addLast(q0); + i0->addLast(q1); + break; + case 1: + if (TaskQueue *p = i0->poll()) { + i1->addLast(p); + } + break; + case 2: + if (TaskQueue *p = i1->poll()) { + i0->addLast(p); + } + break; + case 3: + if (TaskQueue *p = i0->poll()) { + i0->free_(p); + } + if (TaskQueue *p = i1->poll()) { + i1->free_(p); + } + break; + } + } + + + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/ppe/Hello.h Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,7 @@ +#ifndef INCLUDED_TASK_HELLO +#define INCLUDED_TASK_HELLO + +#include "SchedTask.h" + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/ppe/task_init.cc Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,17 @@ +#include "Func.h" +#include "Scheduler.h" + +/* 必ずこの位置に書いて */ +SchedExternTask(Hello); + +/** + * この関数は ../spe/spe-main と違って + * 自分で呼び出せばいい関数なので + * 好きな関数名でおk (SchedRegisterTask は必須) + */ + +void +task_init() +{ + SchedRegisterTask(HELLO_TASK, Hello); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/spe/Hello.cc Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,58 @@ +#include <stdio.h> +#include "Hello.h" +#include "Func.h" +#include "main.h" + +/* これは必須 */ +SchedDefineTask(Hello); + +static int +run(SchedTask *smanager, void *rbuf, void *wbuf) +{ + int task_id = smanager->get_param(0); + + smanager->printf("[%d] Hello, World!!\n", task_id); + +#if 0 +we don't have TaskQueue in spu + QueuePtr q = (QueuePtr )smanager->global_get(0); + + for(int i=0;i<100;i++) { + TaskQueueInfo *i0 = q->q[i%MAX_QUEUE]; + TaskQueueInfo *i1 = q->q[(i+1)%MAX_QUEUE]; + TaskQueue *q0; + TaskQueue *q1; + + // switch(smanager->get_random() % 4) { + switch(q->j++ % 4 ) { + case 0: + q0 = i0->create(0); + q1 = i1->create(0); + i1->addLast(q0); + i0->addLast(q1); + break; + case 1: + if (TaskQueue *p = i0->poll()) { + i1->addLast(p); + } + break; + case 2: + if (TaskQueue *p = i1->poll()) { + i0->addLast(p); + } + break; + case 3: + if (TaskQueue *p = i0->poll()) { + i0->free_(p); + } + if (TaskQueue *p = i1->poll()) { + i1->free_(p); + } + break; + } + } +#endif + + + return 0; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/spe/Hello.h Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,9 @@ +#ifndef INCLUDED_TASK_HELLO +#define INCLUDED_TASK_HELLO + +#ifndef INCLUDED_SCHED_TASK +# include "SchedTask.h" +#endif + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/spe/Makefile Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,26 @@ +include ../Makefile.def + +TARGET = ../spe-main + +SRCS_TMP = $(wildcard *.cc) +SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP)) +OBJS = $(SRCS:.cc=.o) + +CC = spu-g++ +CFLAGS = -O9 -g -Wall -fno-exceptions -fno-rtti#-DDEBUG +INCLUDE = -I../${CERIUM}/include/TaskManager -I. -I.. +LIBS = -L../${CERIUM}/TaskManager -lspemanager -Wl,--gc-sections + +.SUFFIXES: .cc .o + +.cc.o: + $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@ + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS) + +clean: + rm -f $(TARGET) $(OBJS) + rm -f *~ \#* \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/example/task_queue/spe/spe-main.cc Mon Oct 12 11:27:13 2009 +0900 @@ -0,0 +1,29 @@ +#include "Func.h" +#include "Scheduler.h" +#include "main.h" + +SchedExternTask(Hello); + +/** + * この関数は SpeScheduler から呼ばれるので + * 必ずこの関数名でお願いします。 + */ +void +task_init(Scheduler *s) +{ + SchedRegisterTask(HELLO_TASK, Hello); + + QueuePtr q = (QueuePtr) s->allocate(sizeof(Queues)); + + s->global_set(0, (void *)q); + + q->i = 0; + q->j = 0; + +#if 0 + for (int i = 0; i < MAX_QUEUE; i++) { + q->q[i] = new TaskQueueInfo() ; + } +#endif + +}