# HG changeset patch # User tkaito # Date 1274782484 -32400 # Node ID 1ba88b4cfe441b98edb0438fdcc7f4f32e4cd84b # Parent 74fd8d2a7b9d7363fed637f548a9736b06508b2b# Parent beccb8a8bc69fb092bc375b11b8e1a4719462da2 merge diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 Document/Cerium2010.mm --- a/Document/Cerium2010.mm Tue May 25 19:13:28 2010 +0900 +++ b/Document/Cerium2010.mm Tue May 25 19:14:44 2010 +0900 @@ -7,38 +7,76 @@ + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + - - - - + + + + + + + + + + + + + + + + - - - - - - + - + + - - + + @@ -51,6 +89,7 @@ + @@ -64,7 +103,67 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -72,6 +171,7 @@ + diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/Cell/CellTaskManagerImpl.cc --- a/TaskManager/Cell/CellTaskManagerImpl.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.cc Tue May 25 19:14:44 2010 +0900 @@ -161,16 +161,29 @@ // 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: 特に意味のないコマンド } } } +void +CellTaskManagerImpl::polling() +{ + // may call recursively check_task_list_finish() + // we need fifo here + mail_check(); +} + static void send_alloc_reply(CellTaskManagerImpl *tm, int id, SpeThreads *speThreads) { diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/Cell/CellTaskManagerImpl.h --- a/TaskManager/Cell/CellTaskManagerImpl.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Cell/CellTaskManagerImpl.h Tue May 25 19:14:44 2010 +0900 @@ -30,6 +30,7 @@ void append_activeTask(HTaskPtr); void show_profile() ; void start_profile() ; + void polling(); private: void send_taskList(int id); diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/Cell/spe/SpeTaskManagerImpl.h --- a/TaskManager/Cell/spe/SpeTaskManagerImpl.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.h Tue May 25 19:14:44 2010 +0900 @@ -25,7 +25,7 @@ void set_task_depend(HTaskPtr master, HTaskPtr slave); void spawn_task(HTaskPtr); void set_task_cpu(HTaskPtr, CPU_TYPE); - + void polling() {} }; diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/ChangeLog --- a/TaskManager/ChangeLog Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/ChangeLog Tue May 25 19:14:44 2010 +0900 @@ -1,3 +1,12 @@ +2010-5-25 Shinji KONO + + PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう + のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、 + check_task_list_finishとかが再帰的に呼びされるのがやっかい。 + + Task 実行ループは Scheduler にpoling routineを登録するのが良さそう。 + post_func は、SchedTask 経由で poling すれば良い。 + 2010-5-22 Shinji KONO CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。 diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/Fifo/FifoTaskManagerImpl.cc --- a/TaskManager/Fifo/FifoTaskManagerImpl.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc Tue May 25 19:14:44 2010 +0900 @@ -40,6 +40,7 @@ ppeTaskList = new TaskListInfo; schedTaskManager = new SchedTask(); + others = 0; schedTaskManager->init(0,0,0,mainScheduler); } @@ -66,6 +67,7 @@ ppeTaskList = new TaskListInfo; schedTaskManager = new SchedTask(); + others = tm; schedTaskManager->init(0,0,0,mainScheduler); } @@ -168,14 +170,24 @@ __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 } } } - +void +FifoTaskManagerImpl::polling() +{ + if (others!=0) + others->polling(); +} /** * # # # # # # # # diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/Fifo/FifoTaskManagerImpl.h --- a/TaskManager/Fifo/FifoTaskManagerImpl.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Fifo/FifoTaskManagerImpl.h Tue May 25 19:14:44 2010 +0900 @@ -27,6 +27,7 @@ void run(); void show_profile() {}; void start_profile() {}; + void polling(); void mail_check(); diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/Makefile.def --- a/TaskManager/Makefile.def Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/Makefile.def Tue May 25 19:14:44 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 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/kernel/ppe/TaskList.h --- a/TaskManager/kernel/ppe/TaskList.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskList.h Tue May 25 19:14:44 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 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/kernel/ppe/TaskManagerImpl.cc --- a/TaskManager/kernel/ppe/TaskManagerImpl.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc Tue May 25 19:14:44 2010 +0900 @@ -18,7 +18,7 @@ } TaskManagerImpl::TaskManagerImpl(int num) - : machineNum(num) { + : machineNum(num){ activeTaskQueue = new HTaskInfo(); waitTaskQueue = new HTaskInfo(); htaskImpl = waitTaskQueue ; // any HTaskInfo @@ -143,7 +143,7 @@ } /** - * 終了したタスクから依存の処理とか + * @brief 終了したタスクから依存の処理とか * post_func() はこのタスクが終了したら実行する関数。 * * @param [task] 終了したタスク @@ -171,13 +171,45 @@ 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[i]; + 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))+1; + // assert(nextlength); + i+=next; + } + s->polling(); + 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 ; @@ -204,7 +236,7 @@ } memcpy(array, htask->rbuf, htask->r_size); free(htask->rbuf); - htask->rbuf = 0; htask->r_size = 0; + // htask->rbuf = 0; htask->r_size = 0; we need this... *task = *(SimpleTask*)htask; } else { *task = *(SimpleTask*)htask; diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/kernel/ppe/TaskManagerImpl.h --- a/TaskManager/kernel/ppe/TaskManagerImpl.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/ppe/TaskManagerImpl.h Tue May 25 19:14:44 2010 +0900 @@ -23,6 +23,7 @@ SchedTask *schedTaskManager; Scheduler *scheduler; + TaskManagerImpl *others; /* constructor */ TaskManagerImpl(int num = 1) ; @@ -37,8 +38,10 @@ virtual void show_profile() = 0; virtual void append_activeTask(HTaskPtr); virtual void append_waitTask(HTaskPtr); + virtual void polling() = 0; 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 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/kernel/schedule/SchedTask.cc --- a/TaskManager/kernel/schedule/SchedTask.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Tue May 25 19:14:44 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) { // もう何もする必要がない @@ -293,6 +297,11 @@ return manager->allocate(size,align) ; } +void SchedTask::polling() +{ + manager->polling(); +} + Scheduler* SchedTask::get_scheduler() { return scheduler; diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/kernel/schedule/SchedTask.h --- a/TaskManager/kernel/schedule/SchedTask.h Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Tue May 25 19:14:44 2010 +0900 @@ -71,6 +71,8 @@ void *allocate(int size); void free_(void *p) ; + void polling(); + /* これは禁止するべき */ void dma_load(void *buf, memaddr addr, uint32 size, uint32 mask); void dma_store(void *buf,memaddr addr, uint32 size, uint32 mask); diff -r 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/kernel/schedule/SchedTaskArray.cc --- a/TaskManager/kernel/schedule/SchedTaskArray.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArray.cc Tue May 25 19:14:44 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 74fd8d2a7b9d -r 1ba88b4cfe44 TaskManager/kernel/schedule/SchedTaskArrayNop.cc --- a/TaskManager/kernel/schedule/SchedTaskArrayNop.cc Tue May 25 19:13:28 2010 +0900 +++ b/TaskManager/kernel/schedule/SchedTaskArrayNop.cc Tue May 25 19:14:44 2010 +0900 @@ -54,8 +54,9 @@ void SchedTaskArrayNop::write() { - +#ifndef TASK_LIST_MAIL scheduler->mail_write((memaddr)params_addr); +#endif free(atask); }