Mercurial > hg > Game > Cerium
comparison TaskManager/kernel/schedule/SchedTask.cc @ 220:305ac1897c50 draft
fix
author | gongo@localhost.localdomain |
---|---|
date | Mon, 09 Feb 2009 21:58:45 +0900 |
parents | b56fb6ac2fc4 |
children | a314d8cd2082 |
comparison
equal
deleted
inserted
replaced
219:335ea3665fcd | 220:305ac1897c50 |
---|---|
32 ex_init = &SchedTask::ex_init_normal; | 32 ex_init = &SchedTask::ex_init_normal; |
33 ex_read = &SchedTask::ex_read_normal; | 33 ex_read = &SchedTask::ex_read_normal; |
34 ex_exec = &SchedTask::ex_exec_normal; | 34 ex_exec = &SchedTask::ex_exec_normal; |
35 ex_write = &SchedTask::ex_write_normal; | 35 ex_write = &SchedTask::ex_write_normal; |
36 ex_next = &SchedTask::ex_next_normal; | 36 ex_next = &SchedTask::ex_next_normal; |
37 } | 37 |
38 | 38 run_func = &SchedTask::run; |
39 } | |
40 | |
41 /** | |
42 * dma_store の wait を行う | |
43 * このタスクが RenewTask だった場合、 | |
44 * __inListData や __outListData は | |
45 * Scheduler の持つ、使い回しの buffer ではなく | |
46 * 新たに allocate されたものなので、ここで free する | |
47 */ | |
39 SchedTask::~SchedTask(void) | 48 SchedTask::~SchedTask(void) |
40 { | 49 { |
41 if (__flag_renewTask == SCHED_TASK_RENEW) { | 50 if (__flag_renewTask == SCHED_TASK_RENEW) { |
42 /** | |
43 * __inListData と __outListData はタスク自身のものなので | |
44 * 終わったら即 free する。 | |
45 */ | |
46 free(__inListData); | 51 free(__inListData); |
47 free(__outListData); | 52 free(__outListData); |
48 | 53 |
49 /** | 54 /** |
50 * __list != NULL の場合、 | 55 * __list != NULL の場合、 |
164 __debug(" list->next = 0x%x\n", (unsigned int)__list->next); | 169 __debug(" list->next = 0x%x\n", (unsigned int)__list->next); |
165 __debug(" list->length = 0x%x\n", (unsigned int)__list->length); | 170 __debug(" list->length = 0x%x\n", (unsigned int)__list->length); |
166 | 171 |
167 __scheduler->dma_wait(DMA_READ); | 172 __scheduler->dma_wait(DMA_READ); |
168 | 173 |
169 run(__readbuf, __writebuf); | 174 //run(__readbuf, __writebuf); |
170 | 175 |
176 (this->*run_func)(__readbuf, __writebuf); | |
171 free(__readbuf); | 177 free(__readbuf); |
172 | 178 |
173 if (__taskGroup->status() != 0) { | 179 if (__taskGroup->status() != 0) { |
174 __task->self = __taskGroup->command; | 180 __task->self = __taskGroup->command; |
175 delete __taskGroup; | 181 delete __taskGroup; |
176 __taskGroup = NULL; | 182 __taskGroup = NULL; |
177 } | 183 } |
178 | 184 |
179 // 書き込む領域が要らなければ無視 | 185 (this->*ex_exec)(); |
186 } | |
187 | |
188 void | |
189 SchedTask::write(void) | |
190 { | |
191 __debug("[SchedTask:%s]\n", __FUNCTION__); | |
192 | |
193 | |
194 // 書き込む領域がなければ無視 | |
180 if (__outListData->size > 0 || __outListData->length > 0) { | 195 if (__outListData->size > 0 || __outListData->length > 0) { |
181 __scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE); | 196 __scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE); |
182 // SchedTask::write(void) でも wait 掛けてるんだけど、 | 197 } |
183 // 実際にはここに wait しないとちゃんと書き込まれてない感じがする | |
184 // wait はされてるはずなんだがなー | |
185 __scheduler->dma_wait(DMA_WRITE); | |
186 } | |
187 | |
188 (this->*ex_exec)(); | |
189 } | |
190 | |
191 void | |
192 SchedTask::write(void) | |
193 { | |
194 __debug("[SchedTask:%s]\n", __FUNCTION__); | |
195 | |
196 __scheduler->dma_wait(DMA_WRITE); | |
197 free(__writebuf); | |
198 | |
199 /** | |
200 * このタスクはSPE内で生成されたが、 | |
201 * このタスクの終了を待つ必要はない、という設定がされているため、 | |
202 * (wait_task() が呼ばれていない) | |
203 * ここで終了する。ex_write は実行しない | |
204 */ | |
205 if (__task->self == MY_SPE_NOP) return; | |
206 | |
207 (this->*ex_write)(); | |
208 } | 198 } |
209 | 199 |
210 /** | 200 /** |
211 * PPE 内で生成されたタスクの ex_read() | 201 * PPE 内で生成されたタスクの ex_read() |
212 */ | 202 */ |
289 | 279 |
290 SchedTaskBase* | 280 SchedTaskBase* |
291 SchedTask::next(Scheduler *m, SchedTaskBase *p) | 281 SchedTask::next(Scheduler *m, SchedTaskBase *p) |
292 { | 282 { |
293 __debug("[SchedTask:%s]\n", __FUNCTION__); | 283 __debug("[SchedTask:%s]\n", __FUNCTION__); |
284 | |
285 __scheduler->dma_wait(DMA_WRITE); | |
286 free(__writebuf); | |
287 | |
288 (this->*ex_write)(); | |
294 | 289 |
295 delete p; | 290 delete p; |
296 | 291 |
297 return (this->*ex_next)(); | 292 return (this->*ex_next)(); |
298 } | 293 } |