changeset 830:c7905ead974f

return TaskList->self
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 25 May 2010 17:28:05 +0900
parents 4c292ff3558d
children 65e9eab53f50
files TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/ChangeLog TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Makefile.def TaskManager/kernel/ppe/TaskList.h TaskManager/kernel/ppe/TaskManagerImpl.cc TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTaskArray.cc TaskManager/kernel/schedule/SchedTaskArrayNop.cc
diffstat 10 files changed, 59 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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: 特に意味のないコマンド
 	}
--- 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 <kono@ie.u-ryukyu.ac.jp>
+
+    PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう
+    のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、
+    check_task_list_finishとかが再帰的に呼びされるのがやっかい。
+
 2010-5-22 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
     CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。
--- 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
         }
     }
 }
--- 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)
--- 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;
--- 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;i<list->length;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(next<list->length);
+	    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 ; 
--- 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();
 
--- 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) {
 	    // もう何もする必要がない
--- 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
 
     }
 }
--- 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);
 
 }