changeset 499:eacbcdb23986

still fixing...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 11 Oct 2009 15:42:00 +0900
parents cb5ecfc5aaa3
children 14428eda75ba
files TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/kernel/ppe/HTask.h TaskManager/kernel/ppe/HTaskInfo.cc TaskManager/kernel/ppe/HTaskInfo.h TaskManager/kernel/ppe/TaskListInfo.cc TaskManager/kernel/ppe/TaskListInfo.h TaskManager/kernel/ppe/TaskManagerImpl.cc TaskManager/kernel/ppe/TaskQueue.cc TaskManager/kernel/ppe/TaskQueue.h TaskManager/kernel/ppe/TaskQueueInfo.cc TaskManager/kernel/ppe/TaskQueueInfo.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/TaskGroup.cc TaskManager/kernel/schedule/TaskGroup.h
diffstat 14 files changed, 83 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc	Sun Oct 11 15:42:00 2009 +0900
@@ -98,6 +98,7 @@
     list_top = taskListImpl->clear_taskList(list_top);
     list = list_top;
 
+    // printf("active task queue length = %d\n",activeTaskQueue->length());
     while (HTaskPtr htask = activeTaskQueue->poll()) {
         task = &list->tasks[list->length++];
 #if 0
@@ -107,6 +108,9 @@
         task->self     = (unsigned int)htask;
 	// param は?
 #else
+	// inData, outData を内蔵にしたので実は、結構でかくない?
+	// 268 byte 程度だが... 不要な分(設定してない inData, outData, param 
+        // とかもコピーしてるね。rbuf/wbuf の意味を変えてしまったわけか。
         memcpy(task, (Task*)htask, sizeof(Task));
 #endif
 
@@ -117,7 +121,8 @@
             list = newList;
         }
 
-        activeTaskQueue->free_(htask);
+        // activeTaskQueue->free_(htask); ここで free しないで、
+        // mail を待つ
     }
 
     mainTaskList = list_top;
--- a/TaskManager/kernel/ppe/HTask.h	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.h	Sun Oct 11 15:42:00 2009 +0900
@@ -30,7 +30,6 @@
     CPU_TYPE cpu_type;
     TaskManagerImpl *mimpl;
 
-    Task *task;
     HTask *waiter;
     HTask *next;
     HTask *prev;
--- a/TaskManager/kernel/ppe/HTaskInfo.cc	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/HTaskInfo.cc	Sun Oct 11 15:42:00 2009 +0900
@@ -37,11 +37,11 @@
 
     /* Connect all free queue in the pool */
     HTaskPtr p = q;
-    for (; --num > 0; p++) {
+    for (; num-- > 0; p++) {
 	p->waiter = NULL;
 	p->wait_me = new TaskQueueInfo();
 	p->wait_i = new TaskQueueInfo();
-	addLast(p);
+	taskQueuePool.addLast(p);
     }
 
     return 0;
@@ -107,6 +107,11 @@
 void
 HTaskInfo::addLast(HTask* e)
 {
+    if (find(e)) { 
+	fprintf(stderr,"Add duplicate task %0x\n",(int)e);
+	return; 
+       // ...  
+    }
     e->next = first;
     e->prev = last;
     last->next = e;
@@ -130,6 +135,11 @@
 int
 HTaskInfo::remove(HTask* e)
 {
+    if (!find(e)) { 
+	fprintf(stderr,"Remove non existing task %0x\n",(int)e);
+	return 0; 
+       // ...  
+    }
     e->prev->next = e->next;
     e->next->prev = e->prev;
 
@@ -185,12 +195,12 @@
 }
 
 HTask*
-HTaskInfo::find(Task* task)
+HTaskInfo::find(HTask* task)
 {
     HTask* e = first->next;
     for(;;) {
 	if (e == this) return NULL;
-	if (e->task == task) return e;
+	if (e == task) break;
 	e = e->next;
     }
     return e;
@@ -209,6 +219,17 @@
     return q->next;
 }
 
+int
+HTaskInfo::length() 
+{
+    int i = 1;
+    if (empty()) return 0;
+    HTask* e = first;
+    while((e = e->next) != this ) i++;
+    return i;
+}
+
+
 
 
 /* end */
--- a/TaskManager/kernel/ppe/HTaskInfo.h	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/HTaskInfo.h	Sun Oct 11 15:42:00 2009 +0900
@@ -25,13 +25,13 @@
     HTask* poll();
     void moveToFirst(HTask* e); // or use();
     HTask* get(int index);
-    HTask* find(Task *task);
+    HTask* find(HTask *task);
     int empty();
     void freePool() ;
 
     // Iterator
     HTask* getNext(HTask* q) ;
-    int hasNext(HTask* q);
+    int length();
 
 private:
     /* variables */
--- a/TaskManager/kernel/ppe/TaskListInfo.cc	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskListInfo.cc	Sun Oct 11 15:42:00 2009 +0900
@@ -112,3 +112,12 @@
     return list;
 }
 
+int
+TaskListInfo::length(TaskListPtr list)
+{
+    int i = 0;
+    if (!list) return i;
+    while((list=list->next)) i++;
+    return i;
+}
+
--- a/TaskManager/kernel/ppe/TaskListInfo.h	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskListInfo.h	Sun Oct 11 15:42:00 2009 +0900
@@ -18,6 +18,8 @@
     virtual int extend_pool(int num);
     TaskListPtr clear_taskList(TaskListPtr list);
 
+    static int length(TaskListPtr list);
+
 protected:
     /* variables */
     TaskListPtr taskListPool;
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Sun Oct 11 15:42:00 2009 +0900
@@ -26,7 +26,7 @@
  * 番兵的な意味で実装
  */
 void
-TaskManagerImpl::systask_init(void)
+TaskManagerImpl::systask_init()
 {
     systask_register();
 
@@ -39,7 +39,7 @@
     //   systask_finish->wait_for(systask_finish);
     // とかなって無限ループになるので、
     // これだけは明示的に append_waitTask() で
-    append_waitTask(systask_start);
+    append_waitTask(systask_finish);
 }
 
 HTaskPtr
@@ -121,8 +121,13 @@
 void
 TaskManagerImpl::check_task_finish(HTaskPtr me)
 {
+    // post_func を先に実行しないと、systask_finish が active_queue
+    // 移されてから、wait_for されるという事態が起きることがある。
+
+    me->post_func(me->post_arg);
+
     while(TaskQueue *p = me->wait_me->poll()) {
-	HTaskPtr you = (HTaskPtr)p->task;
+	HTaskPtr you = p->task;
 	TaskQueueInfo *wait_i = you->wait_i;
 	// 相手の wait queue から自分(を指しているTaskQueue)を削除
 	wait_i->remove(p->waiter);
@@ -130,14 +135,13 @@
 	wait_i->free_(p->waiter);
 
 	if (wait_i->empty()) {
-	    waitTaskQueue->remove((HTaskPtr)you->task);
-	    append_activeTask((HTaskPtr)you->task);
+	    waitTaskQueue->remove(you);
+	    append_activeTask(you);
 	}
 
 	wait_i->free_(p);
     }
 
-    me->post_func(me->post_arg);
     htaskImpl->free_(me);
 }
 
@@ -153,7 +157,7 @@
  * activeQueue へ移す
  */
 void
-TaskManagerImpl::wakeup_waitTask(void)
+TaskManagerImpl::wakeup_waitTask()
 {
   // done in check_task_finish   
 }
--- a/TaskManager/kernel/ppe/TaskQueue.cc	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskQueue.cc	Sun Oct 11 15:42:00 2009 +0900
@@ -1,6 +1,6 @@
 #include "TaskQueue.h"
 
-TaskQueue::TaskQueue(Task *q)
+TaskQueue::TaskQueue(HTask *q)
 {
     task = q;
     next = NULL;
--- a/TaskManager/kernel/ppe/TaskQueue.h	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskQueue.h	Sun Oct 11 15:42:00 2009 +0900
@@ -3,15 +3,15 @@
 
 #include "base.h"
 
-class Task;
+class HTask;
 
 class TaskQueue {
 public:
-    TaskQueue(Task *q = NULL);
+    TaskQueue(HTask *q = NULL);
 
     BASE_NEW_DELETE(TaskQueue);
 
-    Task *task;
+    HTask *task;
     TaskQueue *waiter;
 
     static TaskQueue* append(TaskQueue* list, TaskQueue* q);
--- a/TaskManager/kernel/ppe/TaskQueueInfo.cc	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskQueueInfo.cc	Sun Oct 11 15:42:00 2009 +0900
@@ -33,17 +33,17 @@
 
     /* Connect all free queue in the pool */
     TaskQueuePtr p = q;
-    for (; --num > 0; p++) {
+    for (; num-- > 0; p++) {
 	p->task = NULL;
 	p->waiter = NULL;
-	addLast(p);
+	taskQueuePool.addLast(p);
     }
 
     return 0;
 }
 
 TaskQueuePtr
-TaskQueueInfo::create(TaskPtr task)
+TaskQueueInfo::create(HTask *task)
 {
     TaskQueuePtr q =  taskQueuePool.poll();
     if (! q)  {
@@ -53,7 +53,6 @@
     q->next = q->prev = NULL;
     q->waiter = NULL;
     q->task = task;
-    task->self = (int)q;
 
     return q;
 }
@@ -166,7 +165,7 @@
 }
 
 TaskQueue*
-TaskQueueInfo::find(Task* task)
+TaskQueueInfo::find(HTask* task)
 {
     TaskQueue* e = first->next;
     for(;;) {
--- a/TaskManager/kernel/ppe/TaskQueueInfo.h	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskQueueInfo.h	Sun Oct 11 15:42:00 2009 +0900
@@ -1,9 +1,10 @@
 #ifndef INCLUDED_TASK_QUEUE_INFO
 #define INCLUDED_TASK_QUEUE_INFO
 
-#include "Task.h"
 #include "TaskQueue.h"
 
+class HTask;
+
 class TaskQueueInfo : public TaskQueue {
 
 
@@ -14,7 +15,7 @@
     BASE_NEW_DELETE(TaskQueueInfo);
 
     /* functions */
-    TaskQueuePtr create(Task *task);
+    TaskQueuePtr create(HTask *task);
     void free_(TaskQueuePtr queue);
 
     void addFirst(TaskQueue* e);
@@ -25,7 +26,7 @@
     TaskQueue* poll();
     void moveToFirst(TaskQueue* e); // or use();
     TaskQueue* get(int index);
-    TaskQueue* find(Task *task);
+    TaskQueue* find(HTask *task);
     int empty();
     void freePool() ;
 
--- a/TaskManager/kernel/schedule/SchedTask.cc	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Sun Oct 11 15:42:00 2009 +0900
@@ -64,17 +64,10 @@
 
 /**
  * dma_store の wait を行う
- * このタスクが RenewTask だった場合、
- * inListData や outListData は
- * Scheduler の持つ、使い回しの buffer ではなく
- * 新たに allocate されたものなので、ここで free する
  */
 SchedTask::~SchedTask()
 {
     if (flag_renewTask == SCHED_TASK_RENEW) {
-        free(inListData);
-        free(outListData);
-
         /**
          * list != NULL の場合、
          * この Task が list の最後の Task になるので (SchedTask::next 参照)
--- a/TaskManager/kernel/schedule/TaskGroup.cc	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/schedule/TaskGroup.cc	Sun Oct 11 15:42:00 2009 +0900
@@ -1,21 +1,23 @@
 #include "TaskGroup.h"
+#include <stdlib.h>
 
 void
 TaskGroup::add(TaskPtr add_task) {
-    TaskQueuePtr q = new TaskQueue(add_task);
-    group = TaskQueue::append(group, q);
+    struct groupQueue *q = (struct groupQueue *)malloc(sizeof(struct groupQueue));
+    q->next = group;
+    group = q;
 }
 
 void
 TaskGroup::remove(TaskPtr delete_task) {
-    TaskQueuePtr p = group;
-    TaskQueuePtr p1;
+    struct groupQueue * p = group;
+    struct groupQueue * p1;
 
     if (p == NULL) return;
 
     if (p->task == delete_task) {
 	group = group->next;
-	delete p;
+	free( p);
     } else {
 	p1 = p->next;
 	while (p1 && p1->task != delete_task) {
@@ -24,7 +26,7 @@
 	}
 	if (p1) {
 	    p->next = p1->next;
-	    delete p1;
+	    free( p1);
 	}
     }
 }
@@ -36,7 +38,7 @@
  * command を返す。
  */
 unsigned int
-TaskGroup::status(void) {
+TaskGroup::status() {
     /**                                                                     
      * bool の                                                              
      *  true == 1;                                                          
--- a/TaskManager/kernel/schedule/TaskGroup.h	Sun Oct 11 11:46:41 2009 +0900
+++ b/TaskManager/kernel/schedule/TaskGroup.h	Sun Oct 11 15:42:00 2009 +0900
@@ -3,10 +3,15 @@
 
 #include "base.h"
 #include "Task.h"
-#include "TaskQueue.h"
 
 class TaskGroup {
 public:
+
+    struct groupQueue {
+	struct groupQueue *next;
+	TaskPtr task;
+    } *group;
+
     TaskGroup(): group(NULL) {}
 
     BASE_NEW_DELETE(TaskGroup);
@@ -14,7 +19,6 @@
     // この command を引き渡すだけのためのオブジェクトらしい
 
     unsigned int command;
-    TaskQueue *group;
 
     /**
      * 待つ Task を追加
@@ -31,7 +35,7 @@
      * PPE に送るべきコマンドを返す。
      * まだ待つべきタスクがある場合は 0 を返す
      */
-    unsigned int status(void);
+    unsigned int status();
 };
 
 typedef TaskGroup* TaskGroupPtr;