# HG changeset patch # User Shinji KONO # Date 1279119276 -32400 # Node ID 586ed400413ad052d09075c3a22d1551a680ebb3 # Parent 1c12673c11beedb9660c580fcb08940207fe38c9 call savedTask->write() in TaskArray finish. TASK_LIST_MAIL is working now. diff -r 1c12673c11be -r 586ed400413a TaskManager/ChangeLog --- 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 + + SchedTaskArray::exec の run の値が最適化で、おかしくなるのは、gcc のbugらしい。 + SimpleTask の finish mail が返るのが早すぎる。write を呼ぶのが正しい。 + cur_index++ してしまうと、task1/task2 のcur_indexが同じになってしまう。 + 2010-5-25 Shinji KONO PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう diff -r 1c12673c11be -r 586ed400413a TaskManager/Makefile.def --- 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) diff -r 1c12673c11be -r 586ed400413a TaskManager/kernel/schedule/SchedTask.cc --- 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) { // もう何もする必要がない diff -r 1c12673c11be -r 586ed400413a TaskManager/kernel/schedule/SchedTaskArrayNop.cc --- 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; } diff -r 1c12673c11be -r 586ed400413a TaskManager/kernel/schedule/SchedTaskBase.h --- 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 用のバッファ