# HG changeset patch # User Shinji KONO # Date 1255243320 -32400 # Node ID eacbcdb23986386e04a82d63715b53e3185f2dee # Parent cb5ecfc5aaa359fdb6c8640f7ceb3ac8e8f06998 still fixing... diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/Fifo/FifoTaskManagerImpl.cc --- 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; diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/HTask.h --- 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; diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/HTaskInfo.cc --- 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 */ diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/HTaskInfo.h --- 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 */ diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/TaskListInfo.cc --- 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; +} + diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/TaskListInfo.h --- 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; diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/TaskManagerImpl.cc --- 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 } diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/TaskQueue.cc --- 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; diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/TaskQueue.h --- 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); diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/TaskQueueInfo.cc --- 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(;;) { diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/ppe/TaskQueueInfo.h --- 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() ; diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/schedule/SchedTask.cc --- 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 参照) diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/schedule/TaskGroup.cc --- 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 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; diff -r cb5ecfc5aaa3 -r eacbcdb23986 TaskManager/kernel/schedule/TaskGroup.h --- 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;