diff TaskManager/Cell/CellTaskManagerImpl.cc @ 936:14fb1c888931

dead lock on spu/ppu mail
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 31 Jul 2010 05:31:12 +0900
parents e015a4e5e4b0
children 9689cba44964
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Sat Jul 31 03:13:24 2010 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Sat Jul 31 05:31:12 2010 +0900
@@ -56,6 +56,7 @@
     // spe 側から Task create できない
     schedTaskManager = new SchedTask();
     schedTaskManager->init(0,0,0,ppeManager->get_scheduler());
+    ppeManager->schedTaskManager = schedTaskManager;
 }
 
 void
@@ -114,7 +115,9 @@
 CellTaskManagerImpl::sendTaskList()
 {
     for (int i = 0; i < machineNum; i++)  {
-	if ( taskListInfo[i]->length() > 0 ) {
+	if (! taskListInfo[i]->empty() ) {
+	    mail_check(i);
+	    // SPE に送る TaskList の準備
 	    send_taskList(i);
 	    spe_running++;
 	}
@@ -124,8 +127,6 @@
 void
 CellTaskManagerImpl::poll()
 {
-    mail_check();
-    // SPE に送る TaskList の準備
     set_runTaskList();
     // TaskList 待ちの SPE に TaskList を送る
     sendTaskList();
@@ -152,35 +153,33 @@
  */
 
 void
-CellTaskManagerImpl::mail_check()
+CellTaskManagerImpl::mail_check(int id)
 {
     memaddr data;
 
     // SPE Scheduler からの mail check
-    for (int id = 0; id < machineNum; id++) {	    
-	while (speThreads->has_mail(id, 1, &data)) {				
-	    if (data == (memaddr)MY_SPE_STATUS_READY) {
-		//  MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了
-	        // freeAll する前に循環リストに戻す
-	        speTaskList[id]->getLast()->next = speTaskList[id];
-	        speTaskList[id]->freeAll();
-		spe_running--;
-	    } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) {
-	        // MY_SPE_COMMAND_MALLOC   SPE からのmain memory request
-		send_alloc_reply(this, id, speThreads);
-	    } else if (data > (memaddr)MY_SPE_NOP) {
+    while (speThreads->has_mail(id, 1, &data)) {				
+	if (data == (memaddr)MY_SPE_STATUS_READY) {
+	    //  MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了
+	    // freeAll する前に循環リストに戻す
+	    speTaskList[id]->getLast()->next = speTaskList[id];
+	    speTaskList[id]->freeAll();
+	    spe_running--;
+	} else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) {
+	    // MY_SPE_COMMAND_MALLOC   SPE からのmain memory request
+	    send_alloc_reply(this, id, speThreads);
+	} else if (data > (memaddr)MY_SPE_NOP) {
 #ifdef TASK_LIST_MAIL
-		TaskListPtr list = (TaskListPtr)data;
-		check_task_list_finish(schedTaskManager, list, waitTaskQueue);
+	    TaskListPtr list = (TaskListPtr)data;
+	    check_task_list_finish(schedTaskManager, list, waitTaskQueue);
 #else
-	        // 終了したタスク(PPEにあるのでアドレス)
-		HTaskPtr task = (HTaskPtr)data;
-		task->post_func(schedTaskManager, task->post_arg1, task->post_arg2);
-		check_task_finish(task, waitTaskQueue);
+	    // 終了したタスク(PPEにあるのでアドレス)
+	    HTaskPtr task = (HTaskPtr)data;
+	    task->post_func(schedTaskManager, task->post_arg1, task->post_arg2);
+	    check_task_finish(task, waitTaskQueue);
 #endif
-	    }
-	    // MY_SPE_NOP: 特に意味のないコマンド
 	}
+	// MY_SPE_NOP: 特に意味のないコマンド
     }
 }
 
@@ -189,7 +188,9 @@
 {
     // may  call recursively check_task_list_finish() 
     // we need fifo here
-    mail_check();
+    for (int i = 0; i < machineNum; i++)  {
+	mail_check(i);
+    }
 }
 
 static void