changeset 888:586ed400413a

call savedTask->write() in TaskArray finish. TASK_LIST_MAIL is working now.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Jul 2010 23:54:36 +0900
parents 1c12673c11be
children b150914f5976
files TaskManager/ChangeLog TaskManager/Makefile.def TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTaskArrayNop.cc TaskManager/kernel/schedule/SchedTaskBase.h
diffstat 5 files changed, 25 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/ChangeLog	Wed Jul 14 20:40:33 2010 +0900
+++ b/TaskManager/ChangeLog	Wed Jul 14 23:54:36 2010 +0900
@@ -1,3 +1,9 @@
+2010-7-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+   SchedTaskArray::exec の run の値が最適化で、おかしくなるのは、gcc のbugらしい。
+   SimpleTask の finish mail が返るのが早すぎる。write を呼ぶのが正しい。
+   cur_index++ してしまうと、task1/task2 のcur_indexが同じになってしまう。
+
 2010-5-25 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
     PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう
--- a/TaskManager/Makefile.def	Wed Jul 14 20:40:33 2010 +0900
+++ b/TaskManager/Makefile.def	Wed Jul 14 23:54:36 2010 +0900
@@ -30,7 +30,7 @@
 ABIBIT = 32
 
 #OPT = -O9
-OPT =  -O9 -g -DTASK_LIST_MAIL
+OPT =  -g -O9 -DTASK_LIST_MAIL
 
 CC     = g++   
 CFLAGS = -Wall `sdl-config --cflags` -m$(ABIBIT)   $(OPT)
--- a/TaskManager/kernel/schedule/SchedTask.cc	Wed Jul 14 20:40:33 2010 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Wed Jul 14 23:54:36 2010 +0900
@@ -53,6 +53,14 @@
     // scheduler->mainMem_wait();   // これはなんで?
     manager = sc->manager;
 
+#ifdef TASK_LIST_MAIL
+    if (list)
+       waiter = (memaddr) list->waiter;
+#else
+    if (task)
+       waiter = (memaddr) task->self;
+#endif
+
 }
 
 
@@ -102,8 +110,11 @@
 
     scheduler->dma_wait(DMA_WRITE);
     free(writebuf);
-#ifndef TASK_LIST_MAIL
-    scheduler->mail_write((memaddr)task->self);
+#ifdef TASK_LIST_MAIL
+    if (!(cur_index < list->length) )
+	scheduler->mail_write(waiter);
+#else
+    scheduler->mail_write(waiter);
 #endif
 }
 
@@ -115,9 +126,9 @@
     if (cur_index < list->length) {
 	// Task List が残っているので、次を準備
 
-	TaskPtr nextTask = &list->tasks[cur_index++];
+	TaskPtr nextTask = &list->tasks[cur_index];
         SchedTask *nextSched = new SchedTask();
-	nextSched->init(list, nextTask, cur_index, scheduler);
+	nextSched->init(list, nextTask, cur_index+1, scheduler);
 	// この時点で、TaskList は down load が済んでないことがある
         // 最初のTaskの種類に関しては、別な情報で渡す方が良い
 	// あるいはTaskListの最初には、TaskArray1/TaskArray を置かない?
@@ -132,9 +143,6 @@
 	}
 	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/SchedTaskArrayNop.cc	Wed Jul 14 20:40:33 2010 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskArrayNop.cc	Wed Jul 14 23:54:36 2010 +0900
@@ -5,7 +5,6 @@
 SchedTaskArrayNop::SchedTaskArrayNop(Scheduler *s, SchedTaskBase *savedTask_, Task *curTask_, Task *_array)
 {
     savedTask = savedTask_;
-    params_addr = (memaddr)savedTask->task->self;
     atask = _array;
     scheduler = s;
 
@@ -54,10 +53,9 @@
 void
 SchedTaskArrayNop::write()
 {
-#ifndef TASK_LIST_MAIL
-    scheduler->mail_write((memaddr)params_addr);
-#endif
+    savedTask ->write();
     free(atask);
+    delete savedTask;
 
 }
 
@@ -69,7 +67,6 @@
 
     SchedTaskBase *n =  savedTask->next(scheduler, savedTask);
     
-    delete savedTask;
     return n;
 
 }
--- a/TaskManager/kernel/schedule/SchedTaskBase.h	Wed Jul 14 20:40:33 2010 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskBase.h	Wed Jul 14 23:54:36 2010 +0900
@@ -52,6 +52,7 @@
     int cur_index;
 
     memaddr params_addr;
+    memaddr waiter;
 
     /**
      * read データ、write 用のバッファ