Mercurial > hg > Members > kono > Cerium
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 */ |