Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/ppe/TaskManagerImpl.cc @ 497:9d225ba0c34f
no wakeup loop
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 10 Oct 2009 21:05:55 +0900 |
parents | 58240647b23b |
children | cb5ecfc5aaa3 |
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Sat Oct 10 20:32:55 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Sat Oct 10 21:05:55 2009 +0900 @@ -120,21 +120,26 @@ * @param [task] 終了したタスク */ void -TaskManagerImpl::check_task_finish(HTaskPtr task) +TaskManagerImpl::check_task_finish(HTaskPtr me) { - while(TaskQueue *p = task->wait_me->poll()) { - HTaskPtr htask = (HTaskPtr)p->task; - TaskQueueInfo *wait_i = htask->wait_i; + while(TaskQueue *p = me->wait_me->poll()) { + HTaskPtr you = (HTaskPtr)p->task; + TaskQueueInfo *wait_i = you->wait_i; // 相手の wait queue から自分(を指しているTaskQueue)を削除 wait_i->remove(p->waiter); // queue を free する wait_i->free_(p->waiter); + if (wait_i->empty()) { + waitTaskQueue->remove(you->self); + append_activeTask(you->self); + } + wait_i->free_(p); } - task->post_func(task->post_arg); - htaskImpl->free(task); + me->post_func(me->post_arg); + htaskImpl->free(me); } @@ -151,18 +156,7 @@ void TaskManagerImpl::wakeup_waitTask(void) { - - for(TaskQueuePtr p = waitTaskQueue->getFirst(); p;) { - HTaskPtr task = (HTaskPtr)p->task; - if (task->wait_i->empty()) { - TaskQueuePtr next = waitTaskQueue->getNext(p); - waitTaskQueue->remove(p); - append_activeTask(p); - p = next; - } else { - p = waitTaskQueue->getNext(p); - } - } + // done in check_task_finish } /* end */