# HG changeset patch # User Shinji KONO # Date 1274776085 -32400 # Node ID c7905ead974ff89f5ee3f34f1c7c18d835913b15 # Parent 4c292ff3558d99b6a045e5ed211a82b9f32b2347 return TaskList->self diff -r 4c292ff3558d -r c7905ead974f TaskManager/Cell/CellTaskManagerImpl.cc --- 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: 特に意味のないコマンド } diff -r 4c292ff3558d -r c7905ead974f TaskManager/ChangeLog --- 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 + + PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう + のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、 + check_task_list_finishとかが再帰的に呼びされるのがやっかい。 + 2010-5-22 Shinji KONO CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。 diff -r 4c292ff3558d -r c7905ead974f TaskManager/Fifo/FifoTaskManagerImpl.cc --- 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 } } } diff -r 4c292ff3558d -r c7905ead974f TaskManager/Makefile.def --- 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) diff -r 4c292ff3558d -r c7905ead974f TaskManager/kernel/ppe/TaskList.h --- 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; diff -r 4c292ff3558d -r c7905ead974f TaskManager/kernel/ppe/TaskManagerImpl.cc --- 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;ilength;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(nextlength); + 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 ; diff -r 4c292ff3558d -r c7905ead974f TaskManager/kernel/ppe/TaskManagerImpl.h --- 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(); diff -r 4c292ff3558d -r c7905ead974f TaskManager/kernel/schedule/SchedTask.cc --- 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) { // もう何もする必要がない diff -r 4c292ff3558d -r c7905ead974f TaskManager/kernel/schedule/SchedTaskArray.cc --- 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 } } diff -r 4c292ff3558d -r c7905ead974f TaskManager/kernel/schedule/SchedTaskArrayNop.cc --- 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); }