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 }