Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/ppe/TaskManagerImpl.cc @ 955:9989dd7b9ac2
unify all QueueInfo
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 04 Aug 2010 16:46:25 +0900 |
parents | 86aea6affe6c |
children |
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Tue Aug 03 15:32:49 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Wed Aug 04 16:46:25 2010 +0900 @@ -8,6 +8,11 @@ #include "SysFunc.h" #include <string.h> +// singleton +QueueInfo<TaskQueue> *taskQueuePool = new QueueInfo<TaskQueue>() ; +QueueInfo<HTask> *htaskPool = new QueueInfo<HTask>() ; +QueueInfo<TaskList> *taskListPool = new QueueInfo<TaskList>() ; + static HTaskPtr systask_start; static HTaskPtr systask_finish; @@ -20,13 +25,13 @@ TaskManagerImpl::TaskManagerImpl(int num) : machineNum(num){ // 実行可能なHTaskのリスト - activeTaskQueue = new HTaskInfo(); + activeTaskQueue = new QueueInfo<HTask>(htaskPool); // wait_forで止まっているHTaskのリスト。必要ないが、Dead lock detection に使う - waitTaskQueue = new HTaskInfo(); - // HTask の factory. HTaskInfo ならなんでもいい。 - htaskImpl = waitTaskQueue ; // any HTaskInfo - // Task の dependency を表現する double linked list. HTaskInfo とは別に必要。 - taskQueueImpl = new TaskQueueInfo(); + waitTaskQueue = new QueueInfo<HTask>(htaskPool); + // HTask の factory. QueueInfo<HTask> ならなんでもいい。 + htaskImpl = waitTaskQueue ; // any QueueInfo<HTask> + // Task の dependency を表現する double linked list. QueueInfo<HTask> とは別に必要。 + taskQueueImpl = new QueueInfo<TaskQueue>(taskQueuePool); } /** @@ -55,7 +60,8 @@ TaskManagerImpl::create_task(int cmd,memaddr rbuf, long r_size, memaddr wbuf, long w_size, void *from) { HTaskPtr new_task; - new_task = htaskImpl->create(cmd, rbuf, r_size, wbuf, w_size); + new_task = htaskImpl->create(); + new_task->init(cmd, rbuf, r_size, wbuf, w_size); new_task->post_func = noaction; new_task->mimpl = this; new_task->from = (memaddr)from; @@ -90,7 +96,7 @@ HTaskPtr new_task; // for compatibility - new_task = htaskImpl->create(TaskArray1); + new_task = htaskImpl->create(); new_task->init(TaskArray1); new_task->post_func = noaction; new_task->mimpl = this; new_task->create_task_array(cmd,1,8,8,8); @@ -123,8 +129,8 @@ TaskQueuePtr m, s; if (!master->self) return; - m = taskQueueImpl->create(master); - s = taskQueueImpl->create(slave); + m = taskQueueImpl->create(); m->init(master); + s = taskQueueImpl->create(); s->init(slave); master->wait_me->addLast(s); slave->wait_i->addLast(m); @@ -175,7 +181,7 @@ #if 0 static void -check_wait(TaskManagerImpl *tm, TaskQueueInfo *wait_i) { +check_wait(TaskManagerImpl *tm, QueueInfo<TaskQueue> *wait_i) { for(TaskQueue *t = wait_i->getFirst(); t; t = wait_i->getNext(t)) { if (!tm->waitTaskQueue->find(t->task)) { printf("stray waiting task%d %lx\n",t->task->command, (long)t->task); @@ -194,11 +200,11 @@ * @param [task] 終了したタスク */ void -TaskManagerImpl::check_task_finish(HTaskPtr me, HTaskInfo *wait_queue) +TaskManagerImpl::check_task_finish(HTaskPtr me, QueueInfo<HTask> *wait_queue) { while(TaskQueue *p = me->wait_me->poll()) { HTaskPtr you = p->task; - TaskQueueInfo *wait_i = you->wait_i; + QueueInfo<TaskQueue> *wait_i = you->wait_i; // 相手の wait queue から自分(を指しているTaskQueue)を削除 wait_i->remove(p->waiter); // queue を free する @@ -229,7 +235,7 @@ * @param [task] 終了したタスク */ void -TaskManagerImpl::check_task_list_finish(SchedTask *s, TaskListPtr list, HTaskInfo *wait_queue) +TaskManagerImpl::check_task_list_finish(SchedTask *s, TaskListPtr list, QueueInfo<HTask> *wait_queue) { for(int i = 0;i<list->length;i++) { SimpleTaskPtr task = &list->tasks[i]; @@ -264,7 +270,7 @@ TaskList は自動的に延長される */ void -TaskManagerImpl::set_taskList(HTaskPtr htask, TaskListInfoPtr taskList) { +TaskManagerImpl::set_taskList(HTaskPtr htask, QueueInfo<TaskList> * taskList) { TaskListPtr list ; if ( taskList->empty() ) { list = taskList->create();