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 * # # # # # # #