Mercurial > hg > Members > kono > Cerium
comparison 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 |
comparison
equal
deleted
inserted
replaced
935:e54842e4d97b | 936:14fb1c888931 |
---|---|
54 // Task 内からManager->task_create() とかするときに必要なTaskManager。 | 54 // Task 内からManager->task_create() とかするときに必要なTaskManager。 |
55 // 現状では ppe 側からしか動かない | 55 // 現状では ppe 側からしか動かない |
56 // spe 側から Task create できない | 56 // spe 側から Task create できない |
57 schedTaskManager = new SchedTask(); | 57 schedTaskManager = new SchedTask(); |
58 schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); | 58 schedTaskManager->init(0,0,0,ppeManager->get_scheduler()); |
59 ppeManager->schedTaskManager = schedTaskManager; | |
59 } | 60 } |
60 | 61 |
61 void | 62 void |
62 CellTaskManagerImpl::append_activeTask(HTaskPtr task) | 63 CellTaskManagerImpl::append_activeTask(HTaskPtr task) |
63 { | 64 { |
112 | 113 |
113 void | 114 void |
114 CellTaskManagerImpl::sendTaskList() | 115 CellTaskManagerImpl::sendTaskList() |
115 { | 116 { |
116 for (int i = 0; i < machineNum; i++) { | 117 for (int i = 0; i < machineNum; i++) { |
117 if ( taskListInfo[i]->length() > 0 ) { | 118 if (! taskListInfo[i]->empty() ) { |
119 mail_check(i); | |
120 // SPE に送る TaskList の準備 | |
118 send_taskList(i); | 121 send_taskList(i); |
119 spe_running++; | 122 spe_running++; |
120 } | 123 } |
121 } | 124 } |
122 } | 125 } |
123 | 126 |
124 void | 127 void |
125 CellTaskManagerImpl::poll() | 128 CellTaskManagerImpl::poll() |
126 { | 129 { |
127 mail_check(); | |
128 // SPE に送る TaskList の準備 | |
129 set_runTaskList(); | 130 set_runTaskList(); |
130 // TaskList 待ちの SPE に TaskList を送る | 131 // TaskList 待ちの SPE に TaskList を送る |
131 sendTaskList(); | 132 sendTaskList(); |
132 } | 133 } |
133 | 134 |
150 /** | 151 /** |
151 * SPE からのメールをチェックする | 152 * SPE からのメールをチェックする |
152 */ | 153 */ |
153 | 154 |
154 void | 155 void |
155 CellTaskManagerImpl::mail_check() | 156 CellTaskManagerImpl::mail_check(int id) |
156 { | 157 { |
157 memaddr data; | 158 memaddr data; |
158 | 159 |
159 // SPE Scheduler からの mail check | 160 // SPE Scheduler からの mail check |
160 for (int id = 0; id < machineNum; id++) { | 161 while (speThreads->has_mail(id, 1, &data)) { |
161 while (speThreads->has_mail(id, 1, &data)) { | 162 if (data == (memaddr)MY_SPE_STATUS_READY) { |
162 if (data == (memaddr)MY_SPE_STATUS_READY) { | 163 // MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了 |
163 // MY_SPE_STATUS_READY: SPE が持ってた Task 全て終了 | 164 // freeAll する前に循環リストに戻す |
164 // freeAll する前に循環リストに戻す | 165 speTaskList[id]->getLast()->next = speTaskList[id]; |
165 speTaskList[id]->getLast()->next = speTaskList[id]; | 166 speTaskList[id]->freeAll(); |
166 speTaskList[id]->freeAll(); | 167 spe_running--; |
167 spe_running--; | 168 } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { |
168 } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { | 169 // MY_SPE_COMMAND_MALLOC SPE からのmain memory request |
169 // MY_SPE_COMMAND_MALLOC SPE からのmain memory request | 170 send_alloc_reply(this, id, speThreads); |
170 send_alloc_reply(this, id, speThreads); | 171 } else if (data > (memaddr)MY_SPE_NOP) { |
171 } else if (data > (memaddr)MY_SPE_NOP) { | |
172 #ifdef TASK_LIST_MAIL | 172 #ifdef TASK_LIST_MAIL |
173 TaskListPtr list = (TaskListPtr)data; | 173 TaskListPtr list = (TaskListPtr)data; |
174 check_task_list_finish(schedTaskManager, list, waitTaskQueue); | 174 check_task_list_finish(schedTaskManager, list, waitTaskQueue); |
175 #else | 175 #else |
176 // 終了したタスク(PPEにあるのでアドレス) | 176 // 終了したタスク(PPEにあるのでアドレス) |
177 HTaskPtr task = (HTaskPtr)data; | 177 HTaskPtr task = (HTaskPtr)data; |
178 task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); | 178 task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); |
179 check_task_finish(task, waitTaskQueue); | 179 check_task_finish(task, waitTaskQueue); |
180 #endif | 180 #endif |
181 } | |
182 // MY_SPE_NOP: 特に意味のないコマンド | |
183 } | 181 } |
182 // MY_SPE_NOP: 特に意味のないコマンド | |
184 } | 183 } |
185 } | 184 } |
186 | 185 |
187 void | 186 void |
188 CellTaskManagerImpl::polling() | 187 CellTaskManagerImpl::polling() |
189 { | 188 { |
190 // may call recursively check_task_list_finish() | 189 // may call recursively check_task_list_finish() |
191 // we need fifo here | 190 // we need fifo here |
192 mail_check(); | 191 for (int i = 0; i < machineNum; i++) { |
192 mail_check(i); | |
193 } | |
193 } | 194 } |
194 | 195 |
195 static void | 196 static void |
196 send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads) | 197 send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads) |
197 { | 198 { |