comparison TaskManager/kernel/ppe/TaskManagerImpl.cc @ 499:eacbcdb23986

still fixing...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 11 Oct 2009 15:42:00 +0900
parents cb5ecfc5aaa3
children 735f76483bb2
comparison
equal deleted inserted replaced
498:cb5ecfc5aaa3 499:eacbcdb23986
24 * 一番最初に PPE で実行される systask_start 24 * 一番最初に PPE で実行される systask_start
25 * 一番最後に、全てのタスクの終了を待つ systask_finish 25 * 一番最後に、全てのタスクの終了を待つ systask_finish
26 * 番兵的な意味で実装 26 * 番兵的な意味で実装
27 */ 27 */
28 void 28 void
29 TaskManagerImpl::systask_init(void) 29 TaskManagerImpl::systask_init()
30 { 30 {
31 systask_register(); 31 systask_register();
32 32
33 systask_start = create_task(SYSTASK_START); 33 systask_start = create_task(SYSTASK_START);
34 systask_finish = create_task(SYSTASK_FINISH); 34 systask_finish = create_task(SYSTASK_FINISH);
37 37
38 // systask_finish で spawn すると 38 // systask_finish で spawn すると
39 // systask_finish->wait_for(systask_finish); 39 // systask_finish->wait_for(systask_finish);
40 // とかなって無限ループになるので、 40 // とかなって無限ループになるので、
41 // これだけは明示的に append_waitTask() で 41 // これだけは明示的に append_waitTask() で
42 append_waitTask(systask_start); 42 append_waitTask(systask_finish);
43 } 43 }
44 44
45 HTaskPtr 45 HTaskPtr
46 TaskManagerImpl::create_task(int cmd) 46 TaskManagerImpl::create_task(int cmd)
47 { 47 {
119 * @param [task] 終了したタスク 119 * @param [task] 終了したタスク
120 */ 120 */
121 void 121 void
122 TaskManagerImpl::check_task_finish(HTaskPtr me) 122 TaskManagerImpl::check_task_finish(HTaskPtr me)
123 { 123 {
124 // post_func を先に実行しないと、systask_finish が active_queue
125 // 移されてから、wait_for されるという事態が起きることがある。
126
127 me->post_func(me->post_arg);
128
124 while(TaskQueue *p = me->wait_me->poll()) { 129 while(TaskQueue *p = me->wait_me->poll()) {
125 HTaskPtr you = (HTaskPtr)p->task; 130 HTaskPtr you = p->task;
126 TaskQueueInfo *wait_i = you->wait_i; 131 TaskQueueInfo *wait_i = you->wait_i;
127 // 相手の wait queue から自分(を指しているTaskQueue)を削除 132 // 相手の wait queue から自分(を指しているTaskQueue)を削除
128 wait_i->remove(p->waiter); 133 wait_i->remove(p->waiter);
129 // queue を free する 134 // queue を free する
130 wait_i->free_(p->waiter); 135 wait_i->free_(p->waiter);
131 136
132 if (wait_i->empty()) { 137 if (wait_i->empty()) {
133 waitTaskQueue->remove((HTaskPtr)you->task); 138 waitTaskQueue->remove(you);
134 append_activeTask((HTaskPtr)you->task); 139 append_activeTask(you);
135 } 140 }
136 141
137 wait_i->free_(p); 142 wait_i->free_(p);
138 } 143 }
139 144
140 me->post_func(me->post_arg);
141 htaskImpl->free_(me); 145 htaskImpl->free_(me);
142 } 146 }
143 147
144 148
145 void 149 void
151 /** 155 /**
152 * waitQueue の中で依存関係を満たしたタスクは 156 * waitQueue の中で依存関係を満たしたタスクは
153 * activeQueue へ移す 157 * activeQueue へ移す
154 */ 158 */
155 void 159 void
156 TaskManagerImpl::wakeup_waitTask(void) 160 TaskManagerImpl::wakeup_waitTask()
157 { 161 {
158 // done in check_task_finish 162 // done in check_task_finish
159 } 163 }
160 164
161 /* end */ 165 /* end */