Mercurial > hg > Members > kono > Cerium
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