Mercurial > hg > Game > Cerium
diff TaskManager/kernel/ppe/TaskManagerImpl.cc @ 499:981aa2f89a80 draft
still fixing...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 11 Oct 2009 15:42:00 +0900 |
parents | bce667ff20b9 |
children | 3bc98f6d31ff |
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Sun Oct 11 11:46:41 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Sun Oct 11 15:42:00 2009 +0900 @@ -26,7 +26,7 @@ * 番兵的な意味で実装 */ void -TaskManagerImpl::systask_init(void) +TaskManagerImpl::systask_init() { systask_register(); @@ -39,7 +39,7 @@ // systask_finish->wait_for(systask_finish); // とかなって無限ループになるので、 // これだけは明示的に append_waitTask() で - append_waitTask(systask_start); + append_waitTask(systask_finish); } HTaskPtr @@ -121,8 +121,13 @@ void TaskManagerImpl::check_task_finish(HTaskPtr me) { + // post_func を先に実行しないと、systask_finish が active_queue + // 移されてから、wait_for されるという事態が起きることがある。 + + me->post_func(me->post_arg); + while(TaskQueue *p = me->wait_me->poll()) { - HTaskPtr you = (HTaskPtr)p->task; + HTaskPtr you = p->task; TaskQueueInfo *wait_i = you->wait_i; // 相手の wait queue から自分(を指しているTaskQueue)を削除 wait_i->remove(p->waiter); @@ -130,14 +135,13 @@ wait_i->free_(p->waiter); if (wait_i->empty()) { - waitTaskQueue->remove((HTaskPtr)you->task); - append_activeTask((HTaskPtr)you->task); + waitTaskQueue->remove(you); + append_activeTask(you); } wait_i->free_(p); } - me->post_func(me->post_arg); htaskImpl->free_(me); } @@ -153,7 +157,7 @@ * activeQueue へ移す */ void -TaskManagerImpl::wakeup_waitTask(void) +TaskManagerImpl::wakeup_waitTask() { // done in check_task_finish }