# 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);
}