Mercurial > hg > Members > kono > Cerium
diff TaskManager/kernel/ppe/TaskManagerImpl.cc @ 479:5bda98b0b56d
Double Linked List base TaskQueue
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 05 Oct 2009 10:36:37 +0900 |
parents | e083c4ff91c1 |
children | 46464727d825 |
line wrap: on
line diff
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Mon Oct 05 08:56:56 2009 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Mon Oct 05 10:36:37 2009 +0900 @@ -62,8 +62,9 @@ m = taskQueueImpl->create(master); s = taskQueueImpl->create(slave); - master->wait_me = TaskQueue::append(master->wait_me, s); - slave->wait_i = TaskQueue::append(slave->wait_i, m); + master->wait_me->addLast(s); + slave->wait_i->addLast(m); + m->waiter = s; } /** @@ -91,10 +92,8 @@ void TaskManagerImpl::append_activeTask(HTaskPtr task) { - TaskQueuePtr q; - - q = taskQueueImpl->create(task); - activeTaskQueue = TaskQueue::append(activeTaskQueue, q); + TaskQueuePtr q = taskQueueImpl->create(task); + activeTaskQueue->addLast(q); } /** @@ -112,46 +111,36 @@ /** * 終了したタスクから依存の処理とか * post_func() はこのタスクが終了したら実行する関数。 - * 今のところ使ってないっす * * @param [task] 終了したタスク */ void TaskManagerImpl::check_task_finish(HTaskPtr task) { - notify_wait_taskQueue(task, task->wait_me); + TaskQueue *p = task->wait_me->getFirst(); + while(p) { + TaskQueue *next = p->next; + HTaskPtr htask = (HTaskPtr)p->task; + TaskQueueInfo *wait_i = htask->wait_i; + // 相手の wait queue から自分(を指しているTaskQueue)を削除 + wait_i->remove(p->waiter); + + // queue を free する + wait_i->free(p->waiter); + wait_i->free(p); + p = next; + } + task->post_func(task->post_arg); htaskImpl->free(task); } -/** - * 終了したタスク [depend] を待っている TaskList に - * 終わった事を知らせる(削除する - */ -void -TaskManagerImpl::notify_wait_taskQueue(HTaskPtr depend, TaskQueuePtr list) -{ - TaskQueuePtr p; - HTaskPtr task; - - p = list; // wait task list - - while (p) { - task = (HTaskPtr)p->task; - task->wait_i = remove_taskQueue_eq_task(task->wait_i, depend); - p = p->next; - } - - remove_taskQueue_all(list); -} void TaskManagerImpl::append_waitTask(HTaskPtr task) { - TaskQueuePtr q; - - q = taskQueueImpl->create(task); - waitTaskQueue = TaskQueue::append(waitTaskQueue, q); + TaskQueuePtr q = taskQueueImpl->create(task); + waitTaskQueue ->addLast(q); } /** @@ -161,87 +150,16 @@ void TaskManagerImpl::wakeup_waitTask(void) { - TaskQueuePtr p, tmp; - - p = waitTaskQueue; + TaskQueuePtr p = waitTaskQueue->getFirst(); while (p) { HTaskPtr task = (HTaskPtr)p->task; - tmp = p; - p = p->next; + TaskQueue *next = p->next; if (task->wait_i == NULL) { - append_activeTask(task); - waitTaskQueue = remove_taskQueue(waitTaskQueue, tmp); + waitTaskQueue->remove(p); + activeTaskQueue->addLast(p); } - } -} - -void -TaskManagerImpl::remove_taskQueue_all(TaskQueuePtr list) -{ - TaskQueuePtr p = list; - TaskQueuePtr p1; - - while (p != NULL) { - p1 = p->next; - taskQueueImpl->free(p); - p = p1; + p = next; } } -/** - * [list] が持つ queue->task の中に [task] と同じ奴があれば - * 削除する。まあ remove_taskQueue() の HTask で比較するverです。 - * こういうのはオーバーロードでやるもんなのかな? - */ -TaskQueuePtr -TaskManagerImpl::remove_taskQueue_eq_task(TaskQueuePtr list, HTaskPtr task) -{ - TaskQueuePtr p = list; - TaskQueuePtr p1; - - if (p == NULL) return p; - - if (p->task == task) { - list = list->next; - taskQueueImpl->free(p); - } else { - p1 = p->next; - while (p1 && p1->task && p1->task != task) { - p1 = p1->next; - p = p->next; - } - if (p1) { - p->next = p1->next; - taskQueueImpl->free(p1); - } - } - - return list; -} - -TaskQueuePtr -TaskManagerImpl::remove_taskQueue(TaskQueuePtr list, TaskQueuePtr q) -{ - TaskQueuePtr p = list; - TaskQueuePtr p1; - - if (!p) return p; - - if (p == q) { - list = list->next; - taskQueueImpl->free(p); - } else { - p1 = p->next; - while (p1 && p1 != q) { - p1 = p1->next; - p = p->next; - } - if (p1) { - p->next = p1->next; - taskQueueImpl->free(p1); - } - } - - return list; -} - +/* end */