Mercurial > hg > Members > kono > Cerium
changeset 830:c7905ead974f
return TaskList->self
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 25 May 2010 17:28:05 +0900 |
parents | 4c292ff3558d |
children | 65e9eab53f50 |
files | TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/ChangeLog TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Makefile.def TaskManager/kernel/ppe/TaskList.h TaskManager/kernel/ppe/TaskManagerImpl.cc TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTaskArray.cc TaskManager/kernel/schedule/SchedTaskArrayNop.cc |
diffstat | 10 files changed, 59 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/Cell/CellTaskManagerImpl.cc Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Tue May 25 17:28:05 2010 +0900 @@ -161,10 +161,15 @@ // MY_SPE_COMMAND_MALLOC SPE からのmain memory request send_alloc_reply(this, id, speThreads); } else if (data > (memaddr)MY_SPE_NOP) { +#ifdef TASK_LIST_MAIL + TaskListPtr list = (TaskListPtr)data; + check_task_list_finish(schedTaskManager, list, waitTaskQueue); +#else // 終了したタスク(PPEにあるのでアドレス) HTaskPtr task = (HTaskPtr)data; task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); - check_task_finish(task,waitTaskQueue); + check_task_finish(task, waitTaskQueue); +#endif } // MY_SPE_NOP: 特に意味のないコマンド }
--- a/TaskManager/ChangeLog Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/ChangeLog Tue May 25 17:28:05 2010 +0900 @@ -1,3 +1,9 @@ +2010-5-25 Shinji KONO <kono@ie.u-ryukyu.ac.jp> + + PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう + のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、 + check_task_list_finishとかが再帰的に呼びされるのがやっかい。 + 2010-5-22 Shinji KONO <kono@ie.u-ryukyu.ac.jp> CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Tue May 25 17:28:05 2010 +0900 @@ -168,9 +168,14 @@ __debug_ppe("mail_check(): recv from 0x%x\n", data); // post_func を先に実行しないと、systask_finish が active_queue // 移されてから、wait_for されるという事態が起きることがある。 +#ifdef TASK_LIST_MAIL + TaskListPtr list = (TaskListPtr)data; + check_task_list_finish(schedTaskManager, list, waitTaskQueue); +#else HTaskPtr task = (HTaskPtr)data; task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); check_task_finish(task, waitTaskQueue); +#endif } } }
--- a/TaskManager/Makefile.def Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/Makefile.def Tue May 25 17:28:05 2010 +0900 @@ -30,7 +30,7 @@ ABIBIT = 32 # OPT = -O9 -OPT = -g +OPT = -g -DTASK_LIST_MAIL CC = g++ CFLAGS = -Wall `sdl-config --cflags` -m$(ABIBIT) $(OPT)
--- a/TaskManager/kernel/ppe/TaskList.h Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskList.h Tue May 25 17:28:05 2010 +0900 @@ -17,7 +17,7 @@ TaskList *waiter; // 4 byte SimpleTask tasks[TASK_MAX_SIZE]; // 24*TASK_MAX_SIZE - void init() { length = 0; } + void init() { length = 0; waiter=this; } }; typedef TaskList* TaskListPtr;
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Tue May 25 17:28:05 2010 +0900 @@ -143,7 +143,7 @@ } /** - * 終了したタスクから依存の処理とか + * @brief 終了したタスクから依存の処理とか * post_func() はこのタスクが終了したら実行する関数。 * * @param [task] 終了したタスク @@ -171,13 +171,44 @@ htaskImpl->free_(me); } +/** + * @brief 終了したタスクリストの依存の処理 + * @param [task] 終了したタスク + */ +void +TaskManagerImpl::check_task_list_finish(SchedTask *s, TaskListPtr list, HTaskInfo *wait_queue) +{ + for(int i = 0;i<list->length;i++) { + SimpleTaskPtr task = &list->tasks[list->length++]; + HTask *me = (HTask*)task->self; + me->post_func(s, me->post_arg1, me->post_arg2); + if (task->command==TaskArray1) { + int next = (task->r_size)/sizeof(SimpleTask); + // assert(next<list->length); + i+=next; + } + check_task_finish(me, wait_queue); + } +} +/** + * @brief waitTaskqueue への挿入 。必須ではない。 + * 現状では、dead lock 検出にしか使ってない + * + * @param [task] 終了したタスク + */ void TaskManagerImpl::append_waitTask(HTaskPtr q) { waitTaskQueue ->addLast(q); } +/** + @brief htask を DMA でCPUに渡すための TaskList に入れる (copy) + @param htask + @param taskList + TaskList は自動的に延長される + */ void TaskManagerImpl::set_taskList(HTaskPtr htask, TaskListInfoPtr taskList) { TaskListPtr list ;
--- a/TaskManager/kernel/ppe/TaskManagerImpl.h Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.h Tue May 25 17:28:05 2010 +0900 @@ -39,6 +39,7 @@ virtual void append_waitTask(HTaskPtr); void check_task_finish(HTaskPtr task, HTaskInfo *wait_queue); + void check_task_list_finish(SchedTask *s, TaskListPtr list, HTaskInfo *wait_queue); void systask_init();
--- a/TaskManager/kernel/schedule/SchedTask.cc Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Tue May 25 17:28:05 2010 +0900 @@ -102,8 +102,9 @@ scheduler->dma_wait(DMA_WRITE); free(writebuf); - +#ifndef TASK_LIST_MAIL scheduler->mail_write((memaddr)task->self); +#endif } SchedTaskBase* @@ -131,6 +132,9 @@ } return nextSched; } else { +#ifdef TASK_LIST_MAIL + scheduler->mail_write((memaddr)list->waiter); +#endif memaddr nextList = (memaddr)list->next; if (nextList == 0) { // もう何もする必要がない
--- a/TaskManager/kernel/schedule/SchedTaskArray.cc Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.cc Tue May 25 17:28:05 2010 +0900 @@ -162,15 +162,6 @@ //1ステージを稼ぐ必要がある return new SchedTaskArrayNop(scheduler, savedTask, next, array); -#if 0 - // このTaskArrayは終り。save していた Task の次を返す。 - // savedTask の read/exec は実行されない (command = TaskArray) - SchedTaskBase *n = savedTask->next(scheduler, savedTask); - scheduler->mail_write((memaddr)savedTask->task->self); - free(array); - delete savedTask; - return n; -#endif } }
--- a/TaskManager/kernel/schedule/SchedTaskArrayNop.cc Tue May 25 03:41:10 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArrayNop.cc Tue May 25 17:28:05 2010 +0900 @@ -54,8 +54,9 @@ void SchedTaskArrayNop::write() { - +#ifndef TASK_LIST_MAIL scheduler->mail_write((memaddr)params_addr); +#endif free(atask); }