changeset 1077:325b6c6d7d65 draft

use one activeTaskQueue
author yutaka@localhost.localdomain
date Fri, 17 Dec 2010 02:23:09 +0900
parents 2a59f318cb67
children 6dabcd1a9ccf
files TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/Cell/CellTaskManagerImpl.h TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Fifo/FifoTaskManagerImpl.h
diffstat 4 files changed, 48 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Fri Dec 17 00:23:52 2010 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Fri Dec 17 02:23:09 2010 +0900
@@ -15,6 +15,8 @@
 
 CellTaskManagerImpl::~CellTaskManagerImpl()
 {
+
+
     delete speThreads;
     delete [] speTaskList;
 
@@ -26,11 +28,6 @@
 {
     spe_running = 0;
     spuIdle = spuIdle_;
-
-    // 実行可能な HTask のリスト。 FifoTaskManager と共有される
-    activeTaskQueue = new QueueInfo<HTask>(htaskPool);
-    // HTask の factory。 HTaskInfo ならなんでもいい。
-    htaskImpl = activeTaskQueue ; // any HTaskInfo
     
     speThreads = new SpeThreads(machineNum);
     speThreads->init();
@@ -39,6 +36,7 @@
     speTaskList   = new QueueInfo<TaskList>*[machineNum]; // spe上の走っている Task の配列
     taskListInfo  = new QueueInfo<TaskList>*[machineNum]; // 次に走る Task の配列
 
+
     for (int i = 0; i < machineNum; i++) {
 	taskListInfo[i] = new QueueInfo<TaskList>(taskListPool);
 	speTaskList[i] = new QueueInfo<TaskList>(taskListPool);
@@ -50,7 +48,13 @@
     MainScheduler *mscheduler = new MainScheduler;
     set_scheduler(mscheduler);
     ppeManager->init(mscheduler, this); // ここで HTaskInfo が共有される。
-    
+
+    // 実行可能な HTask のリスト。 FifoTaskManager と共有される
+    activeTaskQueue = ppeManager->activeTaskQueue;
+    // HTask の factory。 HTaskInfo ならなんでもいい。
+    htaskImpl = activeTaskQueue ; // any HTaskInfo 
+
+   
     ppeManager->get_scheduler()->set_manager(this);
 
     // Task 内からManager->task_create() とかするときに必要なTaskManager。
@@ -83,23 +87,35 @@
  * spe に渡される Task だけ入っている
  */
 void
-CellTaskManagerImpl::set_runTaskList()
+CellTaskManagerImpl::set_runTaskList(QueueInfo<HTask> *activeTaskQueue)
 {
     int speid;
+    HTaskPtr htask = activeTaskQueue->getFirst();
+    while (htask != NULL) {
 
-    while (HTaskPtr htask = activeTaskQueue->poll()) {
+      if (htask->cpu_type == CPU_PPE) {
 
+	htask = activeTaskQueue->getNext(htask);
+	  
+      } else{
 	if (htask->cpu_type == SPE_ANY) {
-	    speid = cur_anySpeid++;
+	  speid = cur_anySpeid++;
 	} else {
-	    // -1 してるのは
-	    // htask->cpu_type - CPU_SPE で
-	    // SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので
-	    // 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため
+	// -1 してるのは
+	// htask->cpu_type - CPU_SPE で
+	// SPE0 = 1, SPE1 = 2, ... SPE5 = 6 ってなってるので
+	// 配列的 (SPE0 = arr[0], SPE1 = arr[1]) にするため
 	    speid = htask->cpu_type - CPU_SPE - 1;
 	}
-	speid %= machineNum;
-	set_taskList(htask, taskListInfo[speid]);
+
+      speid %= machineNum;
+      set_taskList(htask, taskListInfo[speid]);
+
+      HTaskPtr next = activeTaskQueue->getNext(htask);
+      activeTaskQueue->remove(htask);
+      htask = next;
+
+      }
     }
 }
 
@@ -122,7 +138,7 @@
 void
 CellTaskManagerImpl::poll()
 {
-    set_runTaskList();
+    set_runTaskList(activeTaskQueue);
     // TaskList 待ちの SPE に TaskList を送る
     sendTaskList();
 }
--- a/TaskManager/Cell/CellTaskManagerImpl.h	Fri Dec 17 00:23:52 2010 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.h	Fri Dec 17 02:23:09 2010 +0900
@@ -26,7 +26,8 @@
     void run();
     void poll();
     void mail_check(int id);
-    void set_runTaskList();
+    //void set_runTaskList(*QueueInfo<HTask>);
+    void set_runTaskList(QueueInfo<HTask>* activeTaskQueue);
     void sendTaskList();
     void append_activeTask(HTaskPtr);
     void show_profile() ;
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc	Fri Dec 17 00:23:52 2010 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc	Fri Dec 17 02:23:09 2010 +0900
@@ -65,6 +65,7 @@
     taskQueueImpl = tm-> taskQueueImpl ;
     htaskImpl     = tm-> htaskImpl     ;
     waitTaskQueue     = tm->waitTaskQueue;   
+    activeTaskQueue = tm->activeTaskQueue;
 
     taskListInfo  = new QueueInfo<TaskList>(taskListPool);
     ppeTaskList  = new QueueInfo<TaskList>(taskListPool);
@@ -87,18 +88,26 @@
  * 実行タスクリストに入れる
  */
 void
-FifoTaskManagerImpl::set_runTaskList()
+FifoTaskManagerImpl::set_runTaskList(QueueInfo<HTask> *activeTaskQueue)
 {
     // printf("active task queue length = %d\n",activeTaskQueue->length());
-    while (HTaskPtr htask = activeTaskQueue->poll()) {
+    HTaskPtr htask = activeTaskQueue->getFirst();
+    while (htask != NULL) {
+      if (htask->cpu_type == CPU_PPE) {
 	set_taskList(htask, taskListInfo );
+	HTaskPtr next = activeTaskQueue->getNext(htask);
+	activeTaskQueue->remove(htask);
+	htask = next;
+      } else {
+	htask = activeTaskQueue->getNext(htask);
+      }
     }
 }
 
 void
 FifoTaskManagerImpl::poll()
 {
-    set_runTaskList();
+    set_runTaskList(activeTaskQueue);
     // list を実行する
     sendTaskList();
     // ppe scheduler からの mail を調べる
--- a/TaskManager/Fifo/FifoTaskManagerImpl.h	Fri Dec 17 00:23:52 2010 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.h	Fri Dec 17 02:23:09 2010 +0900
@@ -32,7 +32,8 @@
 
     void mail_check();
 
-    void set_runTaskList();
+    void set_runTaskList(QueueInfo<HTask>* activeTaskQueue);
+    //void set_runTaskList();
     void sendTaskList();
 
     void print_arch();