changeset 708:56487849ea2d

cleean up SchedTasks.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 15 Dec 2009 10:49:30 +0900
parents cfca6511aac5
children 8ab63ded2c3f
files Renderer/Engine/Makefile.def Renderer/Test/Makefile.def TaskManager/ChangeLog TaskManager/Makefile.def TaskManager/kernel/schedule/SchedExit.cc TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h TaskManager/kernel/schedule/SchedTaskArray.cc TaskManager/kernel/schedule/SchedTaskArray.h TaskManager/kernel/schedule/SchedTaskArrayLoad.cc TaskManager/kernel/schedule/SchedTaskBase.h TaskManager/kernel/schedule/SchedTaskList.cc TaskManager/kernel/schedule/SchedTaskList.h TaskManager/kernel/schedule/Scheduler.h
diffstat 14 files changed, 105 insertions(+), 106 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/Makefile.def	Mon Dec 14 20:25:03 2009 +0900
+++ b/Renderer/Engine/Makefile.def	Tue Dec 15 10:49:30 2009 +0900
@@ -6,7 +6,7 @@
 ABI = -m$(ABIBIT)
 CC      = g++
 OPT	= -g
-CFLAGS  = -g -Wall $(ABI) $(OPT) # -DSIMPLE_TASK #  -DDEBUG
+CFLAGS  = -g -Wall $(ABI) $(OPT) -DSIMPLE_TASK #  -DDEBUG
 
 INCLUDE = -I$(CERIUM)/include/TaskManager -I.
 # LIBS = -L$(CERIUM)/TaskManager -m$(ABIBIT)
--- a/Renderer/Test/Makefile.def	Mon Dec 14 20:25:03 2009 +0900
+++ b/Renderer/Test/Makefile.def	Tue Dec 15 10:49:30 2009 +0900
@@ -4,7 +4,7 @@
 ABIBIT = 32
 ABI =  -m$(ABIBIT)
 CC      = g++
-CFLAGS  = -g -Wall $(ABI)  # -DSIPMLE_TASK  # -O -DDEBUG
+CFLAGS  = -g -Wall $(ABI)  -DSIPMLE_TASK  # -O -DDEBUG
 
 INCLUDE = -I$(CERIUM)/include/TaskManager -I$(CERIUM)/Renderer/Engine -I. -I$(CERIUM)/include/Cerium
 LIBS = -L$(CERIUM)/TaskManager -L$(CERIUM)/Renderer/Engine $(ABI)
--- a/TaskManager/ChangeLog	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/ChangeLog	Tue Dec 15 10:49:30 2009 +0900
@@ -1,3 +1,16 @@
+2009-12-15 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+   SimpleTask の実装が出来たので、TaskArray からは、
+   PPU側に詳細な情報を返せる。と言うことは、SPU側から
+   PPU Task を投入出来る。実装すればだけど。
+
+   Task 側から書き出し情報を設定するAPIが必要。
+   マニュアルも書くか。
+
+   Down cast をすべてなくしたい。Sched*.cc からは取れました。
+
+   まだ、いらないものが結構あるらしい...
+
 2009-12-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
    ようやっと動きました。SIMPLE_TASK でないのとの互換性
@@ -7,6 +20,9 @@
    今までのHTaskを、TaskArray に読み変えるか。前者は変更が
    多い。後者は、wait_for が微妙。
 
+   前者で実装しました。そのうち落すかも。エラーチェックと、
+   エラー処理関数が必要。コメントを書かないと。
+
 2009-12-12 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
    SchedTask::next で、TaskArray を認識して、そこで、
@@ -177,6 +193,7 @@
 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
     Scheduler / TaskManger / TaskManagerImpl の区別が不明
+    HTask は、TaskManagerImpl を持ってる。
 
     Scheduler は SchedTask から直接見えないはずだが、SchedTask は、
     Scheduler は知っているが、TaskManager は知らない。これがかなりの
--- a/TaskManager/Makefile.def	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/Makefile.def	Tue Dec 15 10:49:30 2009 +0900
@@ -29,8 +29,8 @@
 
 ABIBIT = 32
 
-# SIMPLE_TASK=-DSIMPLE_TASK
-SIMPLE_TASK=
+SIMPLE_TASK=-DSIMPLE_TASK
+# SIMPLE_TASK=
 
 # OPT = -O9 
 OPT =  -g
--- a/TaskManager/kernel/schedule/SchedExit.cc	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedExit.cc	Tue Dec 15 10:49:30 2009 +0900
@@ -5,7 +5,6 @@
 SchedTaskBase*
 SchedExit::next(Scheduler *scheduler, SchedTaskBase *p)
 {
-    // delete p;
 
     __debug("SchedExit::next()\n");
 
--- a/TaskManager/kernel/schedule/SchedTask.cc	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Tue Dec 15 10:49:30 2009 +0900
@@ -18,16 +18,6 @@
 
 extern TaskObject task_list[MAX_TASK_OBJECT];
 
-/**
-   Task Object を作る
- */
-
-
-SchedTask *
-createSchedTask(Scheduler *scheduler, TaskPtr task)
-{
-    return new SchedTask();
-}
 
 #if 0
 /**
@@ -70,9 +60,7 @@
 
 
 void
-SchedTask::init(TaskListPtr _list, TaskPtr _task, int index,
-                    // ListDataPtr rbuf, ListDataPtr wbuf, 
-		    Scheduler* sc)
+SchedTask::init(TaskListPtr _list, TaskPtr _task, int index, Scheduler* sc)
 {
     list        = _list;
     task        = _task;
@@ -169,8 +157,8 @@
 	// Task List が残っているので、次を準備
 
 	TaskPtr nextTask = &list->tasks[cur_index++];
-        SchedTaskBase *nextSched = createSchedTask(scheduler, nextTask);
-	((SchedTask*)nextSched)->init(list, nextTask, cur_index, scheduler);
+        SchedTask *nextSched = new SchedTask();
+	nextSched->init(list, nextTask, cur_index, scheduler);
 #ifdef SIMPLE_TASK
 	if (nextTask->command==TaskArray1) {
 	    // compatibility
@@ -178,7 +166,7 @@
 	}
 	if (nextTask->command==TaskArray) {
 	    // Start Task Array
-	    return (SchedTaskBase*)(new SchedTaskArrayLoad(scheduler, nextSched));
+	    return new SchedTaskArrayLoad(scheduler, nextSched);
 	}
 #endif
 	return nextSched;
@@ -189,7 +177,7 @@
             return new SchedNop2Ready(scheduler);
         } else {
 	    // 新しいリストに取り掛かる
-            return createSchedTaskList(nextList, scheduler, 0);
+	    return new SchedTaskList(nextList, scheduler);
         }
     }
 }
@@ -201,6 +189,10 @@
     return scheduler->id;
 }
 
+void SchedTask::free_(void *p) {
+    scheduler->free_(p);
+}
+
 #ifndef SIMPLE_TASK
 /**
  * task->add_inData で与えられた順番に対応する index (0〜n-1) で、
--- a/TaskManager/kernel/schedule/SchedTask.h	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.h	Tue Dec 15 10:49:30 2009 +0900
@@ -20,26 +20,35 @@
     BASE_NEW_DELETE(SchedTask);
 
     // Task を実行するスケジューラ自身
+#if 0
     Scheduler *scheduler;
+#endif
 
 #ifndef SIMPLE_TASK
+#if 0
     TaskPtr task;
+#endif
     memaddr *param;
     // read/write 用の ListData
     ListDataPtr inListData;
     ListDataPtr outListData;
 #else
+#if 0
     SimpleTaskPtr task;
+#endif
     ListData inListData;
     ListData outListData;
 #endif
 
     /* variables */
     
+#if 0
     // 現在スケジューラが実行している TaskList と、このタスクに対応する Task
     TaskListPtr list;
     // Task の、Tasklist での位置。(task = &list[cur_index-1])
     int cur_index;
+#endif
+
 private:
 
     /**
@@ -112,9 +121,7 @@
 
 
     void *allocate(int size);
-    void free_(void *p) {
-	scheduler->free_(p);
-    }
+    void free_(void *p) ;
 
     /* これは禁止するべき */
     void dma_load(void *buf, memaddr addr, uint32 size, uint32 mask);
@@ -159,12 +166,6 @@
 };
 
 
-#ifdef SIMPLE_TASK
-extern SchedTask* createSchedTask(Scheduler *,SimpleTaskPtr);
-#else
-extern SchedTask* createSchedTask(Scheduler *,TaskPtr);
-#endif
-
 extern void loadSchedTask(Scheduler *scheduler,TaskPtr task);
 
 #endif
--- a/TaskManager/kernel/schedule/SchedTaskArray.cc	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskArray.cc	Tue Dec 15 10:49:30 2009 +0900
@@ -6,7 +6,7 @@
 SchedTaskArray::SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_, Task *curTask_, Task *_array)
 {
     savedTask = savedTask_;
-    task = curTask_;
+    atask = curTask_;
     array = _array;
     scheduler = s;
 
@@ -29,7 +29,6 @@
 SchedTaskArray::SchedTaskArray(Scheduler *s, SchedTaskBase *savedTask_)
 {
     savedTask = savedTask_;
-    SchedTask *sv = (SchedTask*)savedTask_;
     scheduler = s;
 
     inListData.bound = 0;
@@ -41,9 +40,9 @@
     outListData.length = 0;
     outListData.element = 0;
 
-    task = (TaskPtr)&sv->list->tasks[sv->cur_index];
+    atask = (TaskPtr)&savedTask->list->tasks[savedTask->cur_index];
     array = 0;
-    sv->cur_index += (task->size()+sizeof(SimpleTask))/sizeof(SimpleTask);
+    savedTask->cur_index += (atask->size()+sizeof(SimpleTask))/sizeof(SimpleTask);
 
 }
 
@@ -53,6 +52,9 @@
 {
 }
 
+/**
+ *  DMA buffer offset in rbuf
+ */
 static void
 bound(ListData *list)
 {
@@ -65,21 +67,23 @@
     }
 }
 
+/**
+ * Task data / code read
+ */
 void
 SchedTaskArray::read()
 {
-    __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
 
     // object creation をSchedTaskArray生成時にやらないので、
     // exec の直前のread で十分に間に合う
-    loadSchedTask(scheduler, task->command);
+    loadSchedTask(scheduler, atask->command);
 
     // 読むデータが一つもなければ無視
-    if (task->inData_count == 0) return;
+    if (atask->inData_count == 0) return;
 
-    inListData.length = task->inData_count;
-    inListData.size = task->inData_total_size();
-    inListData.element = task->inData(0);
+    inListData.length = atask->inData_count;
+    inListData.size = atask->inData_total_size();
+    inListData.element = atask->inData(0);
     inListData.bound = (int*)scheduler->allocate(inListData.length*sizeof(int));
 
     // load Input Data
@@ -90,16 +94,18 @@
 
 }
 
-
+/**
+ *  Wait read data and execute task
+ *  Start write DMA
+ */
 void
 SchedTaskArray::exec()
 {
-    __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
 
-    if (task->outData_count > 0) {
-	outListData.length = task->outData_count;
-	outListData.size = task->outData_total_size();
-	outListData.element = task->outData(0);
+    if (atask->outData_count > 0) {
+	outListData.length = atask->outData_count;
+	outListData.size = atask->outData_total_size();
+	outListData.element = atask->outData(0);
 	outListData.bound = (int*)scheduler->allocate(outListData.length*sizeof(int));
 	bound(&outListData);
 
@@ -107,23 +113,26 @@
     }
 
     scheduler->dma_wait(DMA_READ);
-    task_list[task->command].wait(scheduler,task->command);
-    task_list[task->command].run(this, readbuf, writebuf);
+    task_list[atask->command].wait(scheduler,atask->command);
+    task_list[atask->command].run(this, readbuf, writebuf);
     free(readbuf);
     // 書き込む領域がなければ無視
 
     // User 側で作る方法が必要...
 
-    if (task->outData_count > 0) {
+    if (atask->outData_count > 0) {
 	// outListData.print();
         scheduler->dma_storeList(&outListData, writebuf, DMA_WRITE);
     }
 }
 
+/**
+ *   Wait write DMA
+ *   send finish mail
+ */
 void
 SchedTaskArray::write()
 {
-    __debug("[SchedTaskArrayArray:%s]\n", __FUNCTION__);
 
     scheduler->dma_wait(DMA_WRITE);
     free(writebuf);
@@ -131,7 +140,7 @@
     free(outListData.bound);
 
     // このTaskArrayは終り。終了を知らせる。
-    if (!array || task->next() >= last()) {
+    if (!array || atask->next() >= last()) {
 	SchedTask *s = (SchedTask *)savedTask;
 	scheduler->mail_write((memaddr)s->task->self);
 	free(array);
@@ -148,12 +157,11 @@
 SchedTaskBase*
 SchedTaskArray::next(Scheduler *scheduler, SchedTaskBase *p)
 {
-    __debug("[SchedTaskArray:%s]\n", __FUNCTION__);
 
-    Task *next = task->next();
+    Task *next = atask->next();
     if (next < last()) {
 	// Task List が残っているので、次を準備
-	return (SchedTaskBase*)new SchedTaskArray(scheduler, savedTask, next, array);
+	return new SchedTaskArray(scheduler, savedTask, next, array);
     } else {
 	// このTaskArrayは終り。save していた Task の次を返す。
 	// savedTask の read/exec は実行されない (command = TaskArray)
@@ -229,7 +237,7 @@
 memaddr
 SchedTaskArray::get_param(int index)
 {
-    return *task->param(index);
+    return *atask->param(index);
 }
 
 #endif
--- a/TaskManager/kernel/schedule/SchedTaskArray.h	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskArray.h	Tue Dec 15 10:49:30 2009 +0900
@@ -24,7 +24,7 @@
 private:
     /* variables */
 
-    TaskPtr task;
+    TaskPtr atask;
     void *readbuf;
     void *writebuf;
 
--- a/TaskManager/kernel/schedule/SchedTaskArrayLoad.cc	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskArrayLoad.cc	Tue Dec 15 10:49:30 2009 +0900
@@ -6,10 +6,9 @@
 
 SchedTaskArrayLoad::SchedTaskArrayLoad(Scheduler *s, SchedTaskBase *savedTask_)
 {
-    SchedTask *sv = (SchedTask*)savedTask_;
     scheduler = s;
     savedTask = savedTask_;
-    task = sv->task;
+    task = savedTask->task;
 }
 
 SchedTaskArrayLoad::~SchedTaskArrayLoad() {}
--- a/TaskManager/kernel/schedule/SchedTaskBase.h	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskBase.h	Tue Dec 15 10:49:30 2009 +0900
@@ -22,6 +22,24 @@
 
     /* functions */
     virtual SchedTaskBase* next(Scheduler *, SchedTaskBase*) {return 0;}
+
+    /* variables */
+
+    // Task を実行するスケジューラ自身
+    Scheduler *scheduler;
+
+#ifndef SIMPLE_TASK
+    TaskPtr task;
+#else
+    SimpleTaskPtr task;
+#endif
+
+    // 現在スケジューラが実行している TaskList と、このタスクに対応する Task
+    TaskListPtr list;
+    // Task の、Tasklist での位置。(task = &list[cur_index-1])
+    int cur_index;
+
+
 };
 
 #endif
--- a/TaskManager/kernel/schedule/SchedTaskList.cc	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskList.cc	Tue Dec 15 10:49:30 2009 +0900
@@ -18,18 +18,13 @@
  *            SPE で生成されている場合、DMA の必要は無い
  *            0: メインメモリ, 1: SPE
  */
-SchedTaskList*
-createSchedTaskList(memaddr next_list, Scheduler* scheduler, int renew_flag)
-{
-    SchedTaskList* sched = new SchedTaskList(next_list, scheduler);
-    return sched;
-}
 
 SchedTaskList::SchedTaskList(memaddr addr, Scheduler *sched)
 {
     params_addr = addr;
     list = NULL;
     scheduler = sched;
+    cur_index = 0;
 
 }
 
@@ -44,37 +39,16 @@
 			    sizeof(TaskList), DMA_READ_TASKLIST);
 }
 
-SchedTaskBase*
-SchedTaskList::next(Scheduler *scheduler, SchedTaskBase *p)
+void
+SchedTaskList::exec() {}
+
+void
+SchedTaskList::write()
 {
-    SchedTaskBase *nextSched;
-
     __debug("[SchedTaskList:%s]\n", __FUNCTION__);
 
     scheduler->dma_wait(DMA_READ_TASKLIST);
-    if (list->length < 1) {
-	nextSched = new SchedNop2Ready(scheduler);
-    } else {
-#ifdef SIMPLE_TASK
-	SimpleTaskPtr nextTask = &list->tasks[0];
-#else
-	TaskPtr nextTask = &list->tasks[0];
-#endif
-	nextSched = createSchedTask(scheduler, nextTask);
-	((SchedTask*)nextSched)->init(list, nextTask, 1, scheduler);
-#ifdef SIMPLE_TASK
-        if (nextTask->command==TaskArray1) {
-            // compatibility
-            return new SchedTaskArray(scheduler, nextSched);
-        }
-        if (nextTask->command==TaskArray) {
-            // Start Task Array
-            return (SchedTaskBase*)(new SchedTaskArrayLoad(scheduler, nextSched));
-        }
-#endif
-    }
-
-    return nextSched;
 }
 
+
 /* end */
--- a/TaskManager/kernel/schedule/SchedTaskList.h	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskList.h	Tue Dec 15 10:49:30 2009 +0900
@@ -3,11 +3,11 @@
 
 #include "base.h"
 #include "Scheduler.h"
-#include "SchedTaskBase.h"
+#include "SchedTask.h"
 
 #include "error.h"
 
-class SchedTaskList : public SchedTaskBase {
+class SchedTaskList : public SchedTask {
 public:
     /* constructor */
     SchedTaskList(memaddr addr, Scheduler *sched);
@@ -16,23 +16,15 @@
 
     /* variables */
     memaddr params_addr;
-    TaskListPtr list;
-    Scheduler *scheduler;
 
-    /* functions */
-    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
-    
     /* override functions */
-    void read(void);
+    void read();
+    void exec();
+    void write();
 
-#ifdef DEBUG
-    void exec(void)  { __debug("[SchedTaskList:%s]\n", __FUNCTION__); }
-    void write(void) { __debug("[SchedTaskList:%s]\n", __FUNCTION__); }
-#endif
 
 };
 
-extern SchedTaskList* createSchedTaskList(memaddr, Scheduler*, int);
 
 #endif
 
--- a/TaskManager/kernel/schedule/Scheduler.h	Mon Dec 14 20:25:03 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.h	Tue Dec 15 10:49:30 2009 +0900
@@ -7,7 +7,6 @@
 #include "ListData.h"
 #include "DmaManager.h"
 #include "SchedTaskBase.h"
-#include "SchedTaskList.h"
 #include "MemList.h"
 #include "MemHash.h"