diff TaskManager/Cell/CellTaskManagerImpl.cc @ 808:3c404a32719c draft

TaskListInfo version
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 22 May 2010 22:32:41 +0900
parents fb49e881f2ed
children 13c736659c63
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Sat May 22 18:21:13 2010 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Sat May 22 22:32:41 2010 +0900
@@ -17,13 +17,6 @@
 {
     delete speThreads;
     delete [] speTaskList;
-    delete [] speTaskList_bg;
-    /**
-     * bufferManager は
-     * ppeManager のなかで delete してもらう
-     */
-    // delete bufferManager;
-    delete [] flag_sendTaskList;
 
     delete ppeManager;
 }
@@ -33,7 +26,7 @@
 {
     spe_running = 0;
     taskListImpl = new CellTaskListInfo;
-    taskListImpl->init(16);
+
 
     activeTaskQueue = new HTaskInfo();
 
@@ -42,18 +35,12 @@
     speThreads = new SpeThreads(machineNum);
     speThreads->init();
 
-    speTaskList  = new TaskListPtr[machineNum];
-    speTaskList_bg  = new TaskListPtr[machineNum];
+    speTaskList  = new TaskListInfoPtr[machineNum];
 
     for (int i = 0; i < machineNum; i++) {
-	speTaskList[i] = taskListImpl->create();
-	speTaskList_bg[i] = taskListImpl->create();
+	speTaskList[i] = new TaskListInfo();
     }
 
-    flag_sendTaskList = new int[machineNum];
-    for (int i = 0; i < machineNum; i++) {
-	flag_sendTaskList[i] = 1;
-    } 
     // PPE 側の管理をする Manager
     ppeManager = new FifoTaskManagerImpl(machineNum);
     // 大半のTaskQueueInfoは、共有される
@@ -114,9 +101,7 @@
 		speid %= machineNum;
 	    }
 	}
-
-	TaskListInfoPtr list = speTaskList_bg[speid];
-	set_taskList(htask, list);
+	set_taskList(htask, taskListInfo[speid]);
     }
 }
 
@@ -124,7 +109,7 @@
 CellTaskManagerImpl::sendTaskList()
 {
     for (int i = 0; i < machineNum; i++)  {
-	if (flag_sendTaskList[i] == 1 && speTaskList_bg[i]->length >= 1 ) {
+	if ( taskListInfo[i]->length() > 0 ) {
 	    send_taskList(i);
 	    spe_running++;
 	}
@@ -132,25 +117,26 @@
 }
 
 void
+CellTaskManagerImpl::poll()
+{
+    mail_check();
+    // SPE に送る TaskList の準備
+    set_runTaskList();
+    // TaskList 待ちの SPE に TaskList を送る
+    sendTaskList();
+}
+
+void
 CellTaskManagerImpl::run()
 {
-    TaskListPtr ppeTaskList = NULL;
-
     do {
         // PPE side
-	ppeTaskList =  ppeManager->set_runTaskList();
-	if (ppeTaskList)
-	    ppeManager->sendTaskList(ppeTaskList);
-	ppeManager->mail_check();
+	ppeManager->poll();
         // SPE side
 	do {
-	    mail_check();
-	    // SPE に送る TaskList の準備
-	    set_runTaskList();
-	    // TaskList 待ちの SPE に TaskList を送る
-	    sendTaskList();
+	    poll();
 	} while (ppeManager->activeTaskQueue->empty() && spe_running >0 );
-    } while (ppeTaskList || spe_running >0); 
+    } while (!ppeManager->taskListInfo->empty() || spe_running >0); 
     if (!waitTaskQueue->empty()) {
 	get_scheduler()->printf("Dead lock detected\n");
     }
@@ -170,7 +156,7 @@
 	while (speThreads->has_mail(id, 1, &data)) {				
 	    if (data == (memaddr)MY_SPE_STATUS_READY) {
 		//  MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了
-		flag_sendTaskList[id] = 1;
+	        speTaskList[id]->freeAll();
 		spe_running--;
 	    } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) {
 	        // MY_SPE_COMMAND_MALLOC   SPE からのmain memory request
@@ -218,22 +204,18 @@
  * 条件1. SPE が持ってた TaskList を終了して、次の TaskList を待ってる
  * 条件2. SPE に送る TaskList に Task がある
  *
- * SPE で実行終了した TaskList [speTaskList] と
- * これから実行する TaskList [speTaskList_bg] のバッファを入れ替える
- * ついでに実行終了したやつは clear しておく。
+ * SPE で実行終了した speTaskList  と
+ * これから実行する taskListInfo  のバッファを入れ替える
  */
 void
 CellTaskManagerImpl::send_taskList(int id)
 {
-    TaskListPtr tmp;
+    if (taskListInfo[id]->empty()) return;
+    TaskListInfoPtr tmp = taskListInfo[id];
+    taskListInfo[id] = speTaskList[id];
+    speTaskList[id] = tmp;
 
-    tmp = speTaskList[id];
-    speTaskList[id]  = speTaskList_bg[id];
-    speTaskList_bg[id] = tmp;
-
-    taskListImpl->clear_taskList(speTaskList_bg[id]);
-
-    speThreads->send_mail(id, 1, (memaddr *)&speTaskList[id]);
+    speThreads->send_mail(id, 1, (memaddr *)tmp->getFirst());
 }
 
 void CellTaskManagerImpl::show_profile() {