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();