Mercurial > hg > Members > kono > Cerium
comparison TaskManager/Fifo/FifoTaskManagerImpl.cc @ 721:2b167196cb27
cleanups..
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 19 Dec 2009 12:12:09 +0900 |
parents | cafffff0f45a |
children | 31d0a5baafdf |
comparison
equal
deleted
inserted
replaced
720:dac59b74e02a | 721:2b167196cb27 |
---|---|
7 #include "types.h" | 7 #include "types.h" |
8 #include "error.h" | 8 #include "error.h" |
9 #include "SchedNop.h" | 9 #include "SchedNop.h" |
10 #include "SysFunc.h" | 10 #include "SysFunc.h" |
11 | 11 |
12 // static void send_alloc_reply(FifoTaskManagerImpl *tm, int id, MainScheduler *s); | |
13 | |
12 FifoTaskManagerImpl::~FifoTaskManagerImpl() | 14 FifoTaskManagerImpl::~FifoTaskManagerImpl() |
13 { | 15 { |
14 delete mainScheduler; | 16 delete mainScheduler; |
15 | 17 |
16 delete taskListImpl ; | 18 delete taskListImpl ; |
69 schedTaskManager = new SchedTask(); | 71 schedTaskManager = new SchedTask(); |
70 schedTaskManager->init(0,0,0,mainScheduler); | 72 schedTaskManager->init(0,0,0,mainScheduler); |
71 | 73 |
72 } | 74 } |
73 | 75 |
74 void FifoTaskManagerImpl::show_profile() { | 76 // void FifoTaskManagerImpl::show_profile() {} |
75 printf("HEHEHEHEH\n"); | 77 // void FifoTaskManagerImpl::start_profile() {} |
76 } | |
77 void FifoTaskManagerImpl::start_profile() {} | |
78 | 78 |
79 /** | 79 /** |
80 * スケジューラに渡す TaskList を取得する。 | 80 * スケジューラに渡す TaskList を取得する。 |
81 * | 81 * |
82 * @return 実行タスクリスト | 82 * @return 実行タスクリスト |
142 void | 142 void |
143 FifoTaskManagerImpl::run() | 143 FifoTaskManagerImpl::run() |
144 { | 144 { |
145 TaskListPtr list; | 145 TaskListPtr list; |
146 | 146 |
147 list = get_runTaskList(); | 147 while((list = get_runTaskList())) { |
148 | |
149 do { | |
150 // list を実行する | 148 // list を実行する |
151 schedule(list); | 149 sendTaskList(list); |
152 | |
153 // ppe scheduler からの mail を調べる | 150 // ppe scheduler からの mail を調べる |
154 mail_check(); | 151 mail_check(); |
155 | 152 } |
156 list = get_runTaskList(); | 153 if (!waitTaskQueue->empty()) { |
157 } while (list); | 154 fprintf(stderr,"Dead lock detected\n"); |
155 } | |
158 } | 156 } |
159 | 157 |
160 /** | 158 /** |
161 * @param [list] 実行タスクリスト | 159 * @param [list] 実行タスクリスト |
162 * @return FifoScheduler からのメール | 160 * @return FifoScheduler からのメール |
163 * | 161 * |
164 * [Tasklist] -> [番兵] -> scheduler->run を抜ける | 162 * [Tasklist] -> [番兵] -> scheduler->run を抜ける |
165 */ | 163 */ |
166 void | 164 void |
167 FifoTaskManagerImpl::schedule(TaskListPtr list) | 165 FifoTaskManagerImpl::sendTaskList(TaskListPtr list) |
168 { | 166 { |
169 if (list) { | 167 // TaskList のアドレスを送る |
170 // TaskList のアドレスを送る | 168 mainScheduler->mail_write_from_host((memaddr)list); |
171 mainScheduler->mail_write_from_host((memaddr)list); | 169 |
172 | 170 // EXIT_COMMAND (番兵的な意味で) |
173 // EXIT_COMMAND (番兵的な意味で) | 171 // これを読むと、mainScheduler->run() から抜けて来る。 |
174 // これを読むと、mainScheduler->run() から抜けて来る。 | 172 mainScheduler->mail_write_from_host((memaddr)MY_SPE_COMMAND_EXIT); |
175 mainScheduler->mail_write_from_host((memaddr)MY_SPE_COMMAND_EXIT); | 173 |
176 | 174 // scheduler は受け取ったメールを元に実行する |
177 // scheduler は受け取ったメールを元に実行する | 175 mainScheduler->run(new SchedNop()); |
178 // new SchedTaskList(list, mainScheduler) の方が良さそうだけど... | 176 // すべてのlistを実行するまで戻らない |
179 mainScheduler->run(new SchedNop()); | |
180 } | |
181 } | 177 } |
182 | 178 |
183 /** | 179 /** |
184 * PPE Scheduler からのメールをチェックする | 180 * PPE Scheduler からのメールをチェックする |
185 * | 181 * |
198 | 194 |
199 if (data == (memaddr)MY_SPE_STATUS_READY) { | 195 if (data == (memaddr)MY_SPE_STATUS_READY) { |
200 __debug_ppe("mail_check(): Task List finish\n"); | 196 __debug_ppe("mail_check(): Task List finish\n"); |
201 } else if (data == (memaddr)MY_SPE_COMMAND_EXIT) { | 197 } else if (data == (memaddr)MY_SPE_COMMAND_EXIT) { |
202 __debug_ppe("mail_check(): Task List finish COMMAND\n"); | 198 __debug_ppe("mail_check(): Task List finish COMMAND\n"); |
199 } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { | |
200 // MY_SPE_COMMAND_MALLOC PPE からのmain memory request | |
201 // 本来は呼ばれないはず... | |
202 fprintf(stderr, "error: MY_SPE_COMMAND_MALLOC from PPE\n"); | |
203 // send_alloc_reply(this, 0, mainScheduler); | |
203 } else if (data != (memaddr)MY_SPE_NOP) { | 204 } else if (data != (memaddr)MY_SPE_NOP) { |
204 __debug_ppe("mail_check(): recv from 0x%x\n", data); | 205 __debug_ppe("mail_check(): recv from 0x%x\n", data); |
205 // post_func を先に実行しないと、systask_finish が active_queue | 206 // post_func を先に実行しないと、systask_finish が active_queue |
206 // 移されてから、wait_for されるという事態が起きることがある。 | 207 // 移されてから、wait_for されるという事態が起きることがある。 |
207 HTaskPtr task = (HTaskPtr)data; | 208 HTaskPtr task = (HTaskPtr)data; |
209 check_task_finish(task, waitTaskQueue); | 210 check_task_finish(task, waitTaskQueue); |
210 } | 211 } |
211 } | 212 } |
212 } | 213 } |
213 | 214 |
215 #if 0 | |
216 static void | |
217 send_alloc_reply(FifoTaskManagerImpl *tm, int id, MainScheduler *s) | |
218 { | |
219 /** | |
220 * info[0] = alloc_id; (CellScheduler::mainMem_alloc 参照) | |
221 * info[1] = alloc_addr; | |
222 */ | |
223 memaddr alloc_info[2]; | |
224 long alloc_size; | |
225 long command; | |
226 | |
227 alloc_info[0] = s->mail_read_from_host(); | |
228 alloc_info[1] = s->mail_read_from_host(); | |
229 command = (long)alloc_info[0]; | |
230 alloc_size = (long)alloc_info[1]; | |
231 | |
232 alloc_info[1] = (memaddr)tm->allocate(alloc_size); | |
233 | |
234 s->mail_write_from_host(alloc_info[0]); | |
235 s->mail_write_from_host(alloc_info[1]); | |
236 } | |
237 #endif | |
238 | |
214 | 239 |
215 /** | 240 /** |
216 * # # # # # # # # | 241 * # # # # # # # # |
217 * Abstract Factory Pattern | 242 * Abstract Factory Pattern |
218 * # # # # # # # | 243 * # # # # # # # |