changeset 526:214cd21049e0

merge
author hiroki@henri.cr.ie.u-ryukyu.ac.jp
date Mon, 12 Oct 2009 11:27:13 +0900
parents 99a92f6a1c59 (current diff) 22e8eba8ad5e (diff)
children 7d9d209bdc82 541013f7015c
files TaskManager/Cell/spe/Task.cc TaskManager/Cell/spe/TaskList.cc TaskManager/Cell/spe/TaskQueue.cc TaskManager/kernel/ppe/SymTable.cc TaskManager/kernel/ppe/SymTable.h
diffstat 61 files changed, 1415 insertions(+), 815 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Mon Oct 12 11:26:17 2009 +0900
+++ b/.hgtags	Mon Oct 12 11:27:13 2009 +0900
@@ -1,2 +1,3 @@
 ce5755f544c1a882c7e28b7c78d8b31a82bd9eda cvs
 1f4c3f3238e6278fa3c73594e027036a1404ec34 fullHD_omedetou
+30568cef3899caea3db0fb9e28b0e6f889c60679 double-linked-task-list
--- a/TaskManager/Cell/CellHTaskInfo.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/Cell/CellHTaskInfo.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -2,30 +2,3 @@
 #include <stdlib.h>
 #include "CellHTaskInfo.h"
 
-int
-CellHTaskInfo::extend_pool(int num)
-{
-    HTaskPtr q = NULL;
-
-    q = (HTaskPtr)malloc(sizeof(HTask)*(num+1));
-
-    if (q == NULL) {
-	return -1;
-    }
-    q->next = htaskPool;
-    htaskPool = q;
-
-    /* Connect all free queue in the pool */
-    for (q = htaskPool + 1; --num > 0; q++) {
-	q->next = q + 1;
-	posix_memalign((void**)&q->inData, DEFAULT_ALIGNMENT, sizeof(ListData));
-	posix_memalign((void**)&q->outData, DEFAULT_ALIGNMENT, sizeof(ListData));
-    }
-    q->next = freeHTask;
-    posix_memalign((void**)&q->inData, DEFAULT_ALIGNMENT, sizeof(ListData));
-    posix_memalign((void**)&q->outData, DEFAULT_ALIGNMENT, sizeof(ListData));
-
-    freeHTask = htaskPool + 1;
-
-    return 0;
-}
--- a/TaskManager/Cell/CellHTaskInfo.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/Cell/CellHTaskInfo.h	Mon Oct 12 11:27:13 2009 +0900
@@ -6,7 +6,6 @@
 class CellHTaskInfo : public HTaskInfo {
 public:
     /* functions */
-    int extend_pool(int num);
 };
 
 #endif
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -5,11 +5,11 @@
 #include <string.h>
 #include "CellTaskManagerImpl.h"
 #include "CellTaskListInfo.h"
-#include "CellHTaskInfo.h"
+#include "HTaskInfo.h"
 #include "PpeScheduler.h"
 #include "types.h"
 
-CellTaskManagerImpl::~CellTaskManagerImpl(void)
+CellTaskManagerImpl::~CellTaskManagerImpl()
 {
     delete speThreads;
     delete [] speTaskList;
@@ -25,16 +25,14 @@
 }
 
 void
-CellTaskManagerImpl::init(void)
+CellTaskManagerImpl::init()
 {
-    taskQueueImpl = new TaskQueueInfo;
-    taskQueueImpl->init(TASK_MAX_SIZE*4);
-
     taskListImpl = new CellTaskListInfo;
     taskListImpl->init(machineNum*2);
 
-    htaskImpl = new CellHTaskInfo;
-    htaskImpl->init(TASK_MAX_SIZE*2);
+    activeTaskQueue = new HTaskInfo();
+
+    htaskImpl = activeTaskQueue ; // any HTaskInfo
 
     speThreads = new SpeThreads(machineNum);
     speThreads->init();
@@ -53,19 +51,17 @@
     } 
     // PPE 側の管理をする Manager
     ppeManager = new FifoTaskManagerImpl(machineNum);
+    // 大半のTaskQueueInfoは、共有される
     ppeManager->init(new PpeScheduler, this);
 }
 
 void
 CellTaskManagerImpl::append_activeTask(HTaskPtr task)
 {
-    TaskQueuePtr q;
-
-    q = taskQueueImpl->create(task);
     if (task->cpu_type == CPU_PPE) {
         ppeManager->append_activeTask(task);
     } else {
-        activeTaskQueue = TaskQueue::append(activeTaskQueue, q);
+        activeTaskQueue->addLast(task);
     }
 }
 
@@ -82,25 +78,15 @@
  * spe に渡される Task だけ入っている
  */
 void
-CellTaskManagerImpl::set_runTaskList(void)
+CellTaskManagerImpl::set_runTaskList()
 {
     // ここ...直すかな
     TaskListPtr list;
-    TaskQueuePtr queue;
-    TaskQueuePtr d;
-    HTaskPtr htask;
+    
     TaskPtr task;
     int speid;
 
-    queue = activeTaskQueue;
-    if (queue == NULL) {
-	return ;
-    }
- 
-    while (queue) {
-	htask = (HTaskPtr)queue->task;
-	d = queue;
-	queue = queue->next;
+    while (HTaskPtr htask = activeTaskQueue->poll()) {
 
 	if (htask->cpu_type == SPE_ANY) {
 	    speid = cur_anySpeid++;
@@ -138,17 +124,16 @@
 	task->outData  = htask->outData;
 	task->self     = (unsigned int)htask;
 #else
-	memcpy(task, htask, sizeof(Task));
+	memcpy(task, (Task*)htask, sizeof(Task));
 #endif
 
-	taskQueueImpl->free(d);
+	// activeTaskQueue->free_(queue);
     }
 
-    activeTaskQueue = NULL;
 }
 
 void
-CellTaskManagerImpl::run(void)
+CellTaskManagerImpl::run()
 {
     TaskListPtr ppeTaskList = NULL;
     MailQueuePtr ppeMail = NULL;
@@ -185,7 +170,7 @@
 CellTaskManagerImpl::mail_check(MailQueuePtr mail_list)
 {
     // PPE Scheduler からの mail check
-    ppeManager->mail_check(mail_list, &waitTaskQueue);
+    ppeManager->mail_check(mail_list, waitTaskQueue);
 
     do {
 	unsigned int data;
@@ -258,7 +243,7 @@
 	// であり、この場合もし SPE にタスクが残っていても
 	// メインループから抜けてプログラム終了となってしまうので
 	// ここでストップかけてます。
-    } while (!ppeManager->activeTaskQueue && waitTaskQueue);
+    } while (ppeManager->activeTaskQueue->empty() && !waitTaskQueue->empty());
 	
     return ppeManager->get_runTaskList();
 }
--- a/TaskManager/Cell/CellTaskManagerImpl.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.h	Mon Oct 12 11:27:13 2009 +0900
@@ -9,7 +9,7 @@
 public:
     /* constructor */
     CellTaskManagerImpl(int num = 1) : TaskManagerImpl(num) {}
-    ~CellTaskManagerImpl(void);
+    ~CellTaskManagerImpl();
 
     /* variables */
     TaskListPtr *speTaskList;
@@ -21,10 +21,10 @@
 
     /* functions */
     // system
-    void init(void);
-    void run(void);
+    void init();
+    void run();
     TaskListPtr mail_check(MailQueuePtr mail_list);
-    void set_runTaskList(void);
+    void set_runTaskList();
     void append_activeTask(HTaskPtr);
 
     // user
--- a/TaskManager/Cell/spe/CellScheduler.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/Cell/spe/CellScheduler.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -68,14 +68,16 @@
  */
 
 #define TEX_LOAD1      0
-#define TEX_LOAD2      1
+// #define TEX_LOAD2      1
 
 uint32
 CellScheduler::get_tag()
 {
     static int count = 0;
-    int i = (count++ % 2);
-    return TEX_LOAD1*i + TEX_LOAD2*(1-i);
+    // int i = (count++ % 2);
+    // return TEX_LOAD1*i + TEX_LOAD2*(1-i);
+    //     0,1,2,3
+    return TEX_LOAD1+(count++ % 2);
 }
 
 
--- a/TaskManager/Cell/spe/Task.cc	Mon Oct 12 11:26:17 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-#include "Task.h"
-
-/**
- * タスクの入力データを追加する
- *
- * @param [addr] add input data
- * @param [size] size of data at [addr]
- *
- * @return if ([ret] == 0) ? success : failuer;
- */
-int
-Task::add_inData_t(unsigned int addr, int size)
-{
-    return add_data(this->inData, addr, size);
-}
-
-int
-Task::add_outData_t(unsigned int addr, int size)
-{
-    return add_data(this->outData, addr, size);
-}
-
-/**
- * エラーの時に -1 を返す、ってことするよりは
- * perror みたいにしたほうがわかりやすいかな。
- *
- * 現在は 3 個まで。
- * 本当は、3個以上にすると task->param[] には アドレスが入り
- * そのアドレスは メインメモリでアロケートされた int の集合。
- */
-int
-Task::add_param(int _param)
-{
-    if (param_size >= MAX_PARAMS) return -1;
-
-    this->param[param_size++] = _param;
-    return 0;
-}
-
-/*
- * エラーの時に -1 を返す、ってことするよりは
- * perror みたいにしたほうがわかりやすいかな。
- */
-int
-Task::add_data(ListDataPtr list, uint32 addr, int size)
-{
-    if (list->length >= MAX_LIST_DMA_SIZE) return -1;
-
-    list->bound[list->length] = list->size;
-
-    // size でも制限かけるべき?
-    list->size += size;
-
-    ListElementPtr elm = &list->element[list->length++];
-    elm->addr = addr;
-    elm->size = size;
-
-    return 0;
-}
--- a/TaskManager/Cell/spe/TaskList.cc	Mon Oct 12 11:26:17 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-#include "TaskList.h"
-
-TaskListPtr
-TaskList::append(TaskListPtr list, TaskListPtr q)
-{
-    TaskListPtr p = list;
-
-    if (!p) {
-	return q;
-    } else {
-	while (p->next) p = p->next;
-	p->next = q;
-	return list;
-    }
-}
-
--- a/TaskManager/Cell/spe/TaskQueue.cc	Mon Oct 12 11:26:17 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-#include "TaskQueue.h"
-
-TaskQueue::TaskQueue(TaskPtr q)
-{
-    task = q;
-    next = NULL;
-}
-
-TaskQueuePtr
-TaskQueue::append(TaskQueuePtr list, TaskQueuePtr q)
-{
-    TaskQueuePtr p = list;
-
-    if (!p) {
-	return q;
-    } else {
-	while(p->next) p = p->next;
-	p->next = q;
-	return list;
-    }
-}
--- a/TaskManager/ChangeLog	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/ChangeLog	Mon Oct 12 11:27:13 2009 +0900
@@ -1,3 +1,39 @@
+2009-10-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+    ようやっと直せました。inListData/outListData は別に転送しないで、
+    一緒に転送してしまった方が良い。どうせ、いつも転送しているのだから。
+
+    word_count が fifo の方が高速なのは、どうにかしてください。
+
+    Renew Task の addInData は、メインメモリからDMAするので正しいらしい。
+    直し方を間違えた。
+
+    Task をmemcpyして、TaskList に入れているが、List DMA に直すべき。
+    Simple Task を常に起動して、List DMA task は、その中で、Renew Task
+    として起動するのが良いのでは? そうすれば、Task Load 自体を Task に
+    出来る。
+
+    Renew Task の実行順序が filo になっている。このあたり変なので、
+    修正するべきでしょう。Renew用の TaskList を持てば良いんじゃないか?
+    task->self の ad-hoc な使い方が泣ける。ひどすぎます。
+
+2009-10-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+    Task 内の create_task は、SchedTask に対してで、
+    PPE 上では、Manager に対してだよね。だから、出来る
+    ことがかなり異なる。これは、まずいだろ?
+
+    特に、PPE task に明示的に manager を渡すってのは、
+    とっても変。
+
+    Renew Task の特別扱いが、いろいろ歪めているんだが、
+    view.cc で使っているので落せない。
+
+2009-10-05 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+    TaskQueue のfree list の管理はシステムで一つであるべき。
+    TaskQueue は double linked list が当然らしい。
+
 2009-10-02 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
     DrawSpan で、~DrawSpan() で、allocate したデータを DMA_WAIT
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -35,12 +35,7 @@
 
     taskListImpl  = new TaskListInfo;
     taskQueueImpl = new TaskQueueInfo;
-    htaskImpl     = new HTaskInfo;
-
-    machineNum = machineNum*2; // What!?
-
-    taskQueueImpl->init(TASK_MAX_SIZE*4);
-    htaskImpl->init(TASK_MAX_SIZE*2);
+    htaskImpl     = new HTaskInfo();
 
     mainTaskList = taskListImpl->create();
 
@@ -66,9 +61,16 @@
     taskListImpl  = tm-> taskListImpl  ;
     taskQueueImpl = tm-> taskQueueImpl ;
     htaskImpl     = tm-> htaskImpl     ;
+    waitTaskQueue     = NULL;   // mail_check で外から設定される
+//    waitTaskQueue     = tm->waitTaskQueue; 
+//    activeTaskQueue     = NULL; // CellTaskManagerImple 側を使う
+
+    // waitTaskQueue     = tm->waitTaskQueue; 
+    // activeQueue は?
 
     mainTaskList = taskListImpl->create();
 
+
 }
 
 /**
@@ -83,13 +85,9 @@
 FifoTaskManagerImpl::get_runTaskList()
 {
     TaskListPtr list, list_top;
-    TaskQueuePtr queue;
-    TaskQueuePtr d;
-    HTaskPtr htask; // HTask (PPE にある)
     TaskPtr task; // Task (SPE に送る Task)
 
-    queue = activeTaskQueue;
-    if (queue == NULL) {
+    if (activeTaskQueue->empty()) {
         return NULL;
     }
 
@@ -100,14 +98,22 @@
     list_top = taskListImpl->clear_taskList(list_top);
     list = list_top;
 
-    while (queue) {
-        htask = (HTaskPtr)queue->task;
-        d = queue;
-        queue = queue->next;
+    // printf("active task queue length = %d\n",activeTaskQueue->length());
+    while (HTaskPtr htask = activeTaskQueue->poll()) {
+        task = &list->tasks[list->length++];
+#if 0
+        task->command  = htask->command;
+        task->inData   = htask->inData;
+        task->outData  = htask->outData;
+        task->self     = (unsigned int)htask;
+	// param は?
+#else
+	// inData, outData を内蔵にしたので実は、結構でかくない?
+	// 268 byte 程度だが... 不要な分(設定してない inData, outData, param 
+        // とかもコピーしてるね。rbuf/wbuf の意味を変えてしまったわけか。
+        memcpy(task, (Task*)htask, sizeof(Task));
+#endif
 
-        task = &list->tasks[list->length++];
-
-        memcpy(task, htask, sizeof(Task));
 
         if (list->length >= TASK_MAX_SIZE) {
             TaskListPtr newList = taskListImpl->create();
@@ -115,10 +121,10 @@
             list = newList;
         }
 
-        taskQueueImpl->free(d);
+        // activeTaskQueue->free_(htask); ここで free しないで、
+        // mail を待つ
     }
 
-    activeTaskQueue = NULL;
     mainTaskList = list_top;
 
     return list_top;
@@ -187,6 +193,13 @@
  *         NULL なら全てのタスクが実行終了したということ
  */
 void
+FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list, HTaskInfo *waitQueue)
+{
+    waitTaskQueue = waitQueue;
+    mail_check(mail_list);
+}
+
+void
 FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list)
 {
     MailQueuePtr q = mail_list;
@@ -219,13 +232,6 @@
     }
 }
 
-void
-FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list, TaskQueuePtr *wait)
-{
-    waitTaskQueue = *wait;
-    mail_check(mail_list);
-}
-
 void*
 FifoTaskManagerImpl::allocate(int size)
 {
--- a/TaskManager/Fifo/FifoTaskManagerImpl.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.h	Mon Oct 12 11:27:13 2009 +0900
@@ -13,7 +13,7 @@
 
     /* variables */
     int machineNum;
-    TaskListPtr mainTaskList;
+    TaskListPtr mainTaskList;  // activeTask であるべきなんじゃないの?
 
     MailManager *mailManager;
     MainScheduler *scheduler;
@@ -24,7 +24,7 @@
     void init(MainScheduler*, TaskManagerImpl*);
     void run(void);
     void mail_check(MailQueuePtr mail_list);
-    void mail_check(MailQueuePtr mail_list, TaskQueuePtr *waitQueue);
+    void mail_check(MailQueuePtr mail_list, HTaskInfo *waitQueue);
     TaskListPtr get_runTaskList(void);
     MailQueuePtr schedule(TaskListPtr);
 
--- a/TaskManager/Makefile.cell	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/Makefile.cell	Mon Oct 12 11:27:13 2009 +0900
@@ -19,15 +19,17 @@
 
 CELL_SPE_SRCS =  \
     $(CELL_SPE_DIR)/CellDmaManager.cc   \
+    $(CELL_SPE_DIR)/CellScheduler.cc    \
+    $(CELL_SPE_DIR)/main.cc
+
+CELL_SPE_TASK_SRCS =  \
     $(CELL_SPE_DIR)/TaskList.cc \
-    $(CELL_SPE_DIR)/CellScheduler.cc    \
     $(CELL_SPE_DIR)/TaskQueue.cc \
-    $(CELL_SPE_DIR)/Task.cc            \
-    $(CELL_SPE_DIR)/main.cc
+    $(CELL_SPE_DIR)/Task.cc           
 
 # $(wildcard $(CELL_SPE_DIR)/*.cc)
 
-CELL_SPE_OBJS = $(CELL_SPE_SRCS:.cc=.o) $(CELL_SPE_SCHEDULE_OBJ)
+CELL_SPE_OBJS = $(CELL_SPE_SRCS:.cc=.o) $(CELL_SPE_SCHEDULE_OBJ) $(CELL_SPE_TASK_SRCS:.cc=.o)
 
 SPUCC = spu-g++
 
@@ -53,6 +55,8 @@
 $(CELL_SPE_SCHEDULE_SRC): kernel/schedule/*.cc
 	cp kernel/schedule/*.cc $(CELL_SPE_DIR)/
 	cp kernel/memory/*.cc $(CELL_SPE_DIR)/
+	cp kernel/ppe/{TaskList.cc,TaskQueue.cc,Task.cc} $(CELL_SPE_DIR)/
+
 $(CELL_SPE_OBJS): %.o : %.cc
 	$(SPUCC) $(CFLAGS) $(SPE_CFLAGS) $(INCLUDE) -c $< -o $@
 
@@ -61,7 +65,7 @@
 	rm -f $(SPETARGET)
 
 cellclean:
-	rm -f $(CELL_SPE_OBJS) $(CELL_SPE_SCHEDULE_SRC)
+	rm -f $(CELL_SPE_OBJS) $(CELL_SPE_SCHEDULE_SRC) $(CELL_SPE_TASK_SRCS)
 	(cd $(CELL_SPE_DIR); rm -f *~ \#*)
 
 
--- a/TaskManager/Test/test_render/Makefile	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/Test/test_render/Makefile	Mon Oct 12 11:27:13 2009 +0900
@@ -33,7 +33,7 @@
 	perl tools/create_sglist.pl xml_file/*.xml 
 
 run-ps3:
-	/usr/sbin/ps3-video-mode -v 133
+	/usr/*bin/ps3-video-mode -v 133
 	./test_nogl -video fb -width 1920 -height 1080 $(CPU) $(SG)
 
 run-ps3tv:
--- a/TaskManager/kernel/ppe/HTask.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/HTask.h	Mon Oct 12 11:27:13 2009 +0900
@@ -23,13 +23,16 @@
 public:
     BASE_NEW_DELETE(HTask);
 
-    TaskQueuePtr wait_me;  // List of task waiting for me
-    TaskQueuePtr wait_i;   // List of task for which I am waiting
+    TaskQueueInfo *wait_me;  // List of task waiting for me
+    TaskQueueInfo *wait_i;   // List of task for which I am waiting
     void (*post_func)(void *arg);
     void *post_arg;
     CPU_TYPE cpu_type;
+    TaskManagerImpl *mimpl;
+
+    HTask *waiter;
     HTask *next;
-    TaskManagerImpl *mimpl;
+    HTask *prev;
 
     void spawn(void);
     void wait_for(HTask *);
--- a/TaskManager/kernel/ppe/HTaskInfo.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/HTaskInfo.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -2,49 +2,47 @@
 #include <stdlib.h>
 #include "TaskManagerImpl.h"
 #include "HTaskInfo.h"
+#include "TaskQueueInfo.h"
 
-HTaskInfo::HTaskInfo(void)
-    :htaskPool(NULL), freeHTask(NULL) {}
-
-HTaskInfo::~HTaskInfo(void) { destroy(); }
+// Singleton HTask Pool
+HTaskInfo HTaskInfo::taskQueuePool;   
 
-int
-HTaskInfo::init(int num)
-{
-    if (htaskPool == NULL) {
-	return extend_pool(num);
-    }
-    return 0;
+HTaskInfo::HTaskInfo() {
+    // 最初の一つは自分
+    first = last = this;
+    next = prev = this;
+    waiter = NULL;
 }
 
-/**
- * Fix me
- *   extend できる限界を設定するべき?
- */
+void
+HTaskInfo::freePool() { 
+    for(HTaskPtr p = taskQueuePool.waiter; p; ) {
+	HTaskPtr next = p->waiter;
+	p->waiter = NULL;
+	delete p->wait_me;
+	delete p->wait_i;
+	free(p);
+	p = next;
+    }
+}
+
 int
 HTaskInfo::extend_pool(int num)
 {
-    HTaskPtr q = NULL;
-
-    q = (HTaskPtr)malloc(sizeof(HTask)*(num+1));
+    HTaskPtr q = (HTaskPtr)malloc(sizeof(HTask)*(num+1));
 
-    if (q == NULL) {
-	return -1;
-    }
-    q->next = htaskPool;
-    htaskPool = q;
+    // First Queue is previous pool
+    q->waiter = waiter; waiter = q;
+    q++;
 
     /* Connect all free queue in the pool */
-    for (q = htaskPool + 1; --num > 0; q++) {
-	q->next = q + 1;
-	q->inData = (ListDataPtr)malloc(sizeof(ListData));
-	q->outData = (ListDataPtr)malloc(sizeof(ListData));
+    HTaskPtr p = q;
+    for (; num-- > 0; p++) {
+	p->waiter = NULL;
+	p->wait_me = new TaskQueueInfo();
+	p->wait_i = new TaskQueueInfo();
+	taskQueuePool.addLast(p);
     }
-    q->next = freeHTask;
-    q->inData = (ListDataPtr)malloc(sizeof(ListData));
-    q->outData = (ListDataPtr)malloc(sizeof(ListData));
-
-    freeHTask = htaskPool + 1;
 
     return 0;
 }
@@ -57,54 +55,187 @@
 HTaskPtr
 HTaskInfo::create(int cmd)
 {
-    HTaskPtr q;
-    
-    if (freeHTask == NULL) {
-	extend_pool(100);
+    HTaskPtr q =  taskQueuePool.poll();
+    if (! q)  {
+	taskQueuePool.extend_pool(64);
+	q = taskQueuePool.poll();
     }
-
-    q = freeHTask;
-    freeHTask = freeHTask->next;
+    q->next = q->prev = NULL;
+    q->waiter = NULL;
 
     q->command  = cmd;
-    q->inData->clear();
-    q->outData->clear();
-    q->self = (unsigned int)q;
+    q->inData.clear();
+    q->outData.clear();
+    q->self = (int) q;
     q->param_size = 0;
 
-    q->wait_me  = NULL;
-    q->wait_i   = NULL;
     q->post_func = NULL;
     q->mimpl     = NULL;
     q->cpu_type  = CPU_PPE;
 
+    // q->wait_me.clear();
+    // q->wait_i.clear();
+
     return q;
 }
 
 void
-HTaskInfo::free(HTaskPtr q)
+HTaskInfo::free_(HTaskPtr q)
 {
-    q->next = freeHTask;
-    freeHTask = q;
+    q->waiter = NULL;
+    taskQueuePool.addLast(q);
+}
+
+
+/*!
+  HTaskInfo は空にならない。最低1個は要素が入っていて
+  1個目は特別扱いする。getFirst すると first->next を返す
+ */
+
+/*!
+  最初の1個は特別扱いなので、それの後に追加していく
+ */
+void
+HTaskInfo::addFirst(HTask* e)
+{
+    e->prev = first;
+    e->next = first->next;
+    first->next->prev = e;
+    first->next = e;
 }
 
 void
-HTaskInfo::destroy(void)
+HTaskInfo::addLast(HTask* e)
 {
-    HTaskPtr q, tmp; 
+#ifdef CHECK
+    if (find(e)) { 
+	fprintf(stderr,"Add duplicate task %0x\n",(int)e);
+	return; 
+       // ...  
+    }
+#endif
+    e->next = first;
+    e->prev = last;
+    last->next = e;
+    last = e;
+}
 
-#if 1
-    q = htaskPool;
-    while (q) {
-	tmp = q->next;
-	free(q);
-	q = tmp;
-    }
-#else
-    for (q = htaskPool; q; q = q->next) {
-	free(q);
+HTask*
+HTaskInfo::getFirst()
+{
+    if (empty()) return NULL;
+    return first->next;
+}
+
+HTask*
+HTaskInfo::getLast()
+{
+    if (empty()) return NULL;
+    return last;
+}
+
+int
+HTaskInfo::remove(HTask* e)
+{
+#ifdef CHECK
+    if (!find(e)) { 
+	fprintf(stderr,"Remove non existing task %0x\n",(int)e);
+	return 0; 
+       // ...  
     }
 #endif
+    e->prev->next = e->next;
+    e->next->prev = e->prev;
 
-    freeHTask = htaskPool = NULL;
+    if (first->next == e) {
+	first->next = e->next;
+    }
+    if (last == e) {
+	last = e->prev;
+    }
+
+    e->prev = NULL;
+    e->next = NULL;
+
+    return 1;
+}
+
+/*!
+  リストの先頭を取得および削除する。リストが空の場合は NULL を返す。
+ */
+
+HTask*
+HTaskInfo::poll()
+{
+    HTask* e = first->next;
+    if (e == this) {
+	return NULL;
+    }
+    remove(e);
+    return e;
+}
+
+void
+HTaskInfo::moveToFirst(HTask* e)
+{
+    remove(e);
+    addFirst(e);
 }
+
+/*!
+  リスト内の指定された位置にある要素を返す。
+  要素数を超えた位置を指定した場合 NULL を返す。
+ */
+
+HTask*
+HTaskInfo::get(int index)
+{
+    HTask* e = first->next;
+    for (int i = 0; i < index; i++) {
+	if (e == this) return NULL;
+	e = e->next;
+    }
+    return e;
+}
+
+HTask*
+HTaskInfo::find(HTask* task)
+{
+    HTask* e = first->next;
+    for(;;) {
+	if (e == this) return NULL;
+	if (e == task) break;
+	e = e->next;
+    }
+    return e;
+}
+
+int
+HTaskInfo::empty()
+{
+    return next == this;
+}
+
+HTask*
+HTaskInfo::getNext(HTask* q) 
+{
+    if (q->next==this) return NULL;
+    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	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/HTaskInfo.h	Mon Oct 12 11:27:13 2009 +0900
@@ -1,29 +1,48 @@
 #ifndef INCLUDED_HTASK_INFO
 #define INCLUDED_HTASK_INFO
 
+#include "Task.h"
 #include "HTask.h"
 
-class HTaskInfo {
+class HTaskInfo : public HTask {
+
 public:
     /* constructor */
-    HTaskInfo(void);
-    virtual ~HTaskInfo(void);
+    HTaskInfo();
+
+    BASE_NEW_DELETE(HTaskInfo);
 
     /* functions */
-    int init(int num);
     HTaskPtr create(int cmd);
-    void free(HTaskPtr q);
-    virtual int extend_pool(int num);
+
+    void free_(HTaskPtr queue);
 
-protected:
+    void addFirst(HTask* e);
+    void addLast(HTask* e);
+    HTask* getFirst();
+    HTask* getLast();
+    int remove(HTask* e);
+    HTask* poll();
+    void moveToFirst(HTask* e); // or use();
+    HTask* get(int index);
+    HTask* find(HTask *task);
+    int empty();
+    void freePool() ;
+
+    // Iterator
+    HTask* getNext(HTask* q) ;
+    int length();
+
+private:
     /* variables */
-    HTaskPtr htaskPool;
-    HTaskPtr freeHTask;
+
+    static HTaskInfo taskQueuePool;
+    HTask* first;
+    HTask* last;
 
     /* functions */
-    void destroy(void);
-    
-private:
+    int extend_pool(int num);
+    void destroy();  
 };
 
 #endif
--- a/TaskManager/kernel/ppe/SymTable.cc	Mon Oct 12 11:26:17 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#include <string.h>
-#include "SymTable.h"
-
-SymTable::~SymTable(void)
-{
-    SymTbPtr tb;
-
-    for (int i = 0; i < symtb_index; i++) {
-	tb = &symtb[i];
-	delete [] tb->sym;
-    }
-
-    delete [] symtb;
-}
-
-void
-SymTable::init(void)
-{
-    symtb = new SymTb[SYM_MAX_SIZE];
-    symtb_index = 0;
-}
-
-void
-SymTable::set_symbol(const char *sym, FuncObject addr)
-{
-    SymTbPtr tb = &symtb[symtb_index++];
-
-    tb->sym = new char[strlen(sym)+1];
-    memcpy(tb->sym, sym, strlen(sym)+1);
-    tb->address = addr;
-}
-
-void
-SymTable::set_func(int id, FuncObject addr)
-{
-     SymTbPtr tb = &symtb[id];
-
-     tb->address = addr;
-}
-
-SymTable::FuncObject
-SymTable::get_address(int fd)
-{
-    if (fd >= symtb_index) {
-	// Fix me
-	// error process
-    }
-
-    return symtb[fd].address;
-}
-
-
-int
-SymTable::get_fd(const char *sym)
-{
-    SymTbPtr tb;
-
-    for (int i = 0; i < SYM_MAX_SIZE; i++) {
-	tb = &symtb[i];
-	if (strcmp(tb->sym, sym) == 0) {
-	    return i;
-	}
-    }
-
-    return -1;
-}
--- a/TaskManager/kernel/ppe/SymTable.h	Mon Oct 12 11:26:17 2009 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#ifndef INCLUDED_SYMTABLE
-#define INCLUDED_SYMTABLE
-
-#define SYM_MAX_SIZE 64
-
-class SymTable {
-public:
-    ~SymTable(void);
-
-    typedef int (*FuncObject)(void *, void*);
-
-    typedef struct sym_table {
-	 char *sym;
-	 FuncObject address;
-    } SymTb, *SymTbPtr;
-
-    SymTbPtr symtb;
-    int symtb_index;
-
-    void init(void);
-    void set_symbol(const char *sym, FuncObject addr);
-    void set_func(int id, FuncObject addr);
-    int get_fd(const char *sym);
-    FuncObject get_address(int fd);
-};
-
-#endif
--- a/TaskManager/kernel/ppe/Task.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -11,7 +11,7 @@
 int
 Task::add_inData_t(unsigned int addr, int size)
 {
-    return add_data(this->inData, addr, size);
+    return add_data(inData, addr, size);
 }
 
 /**
@@ -25,12 +25,16 @@
 int
 Task::add_outData_t(unsigned int addr, int size)
 {
-    return add_data(this->outData, addr, size);
+    return add_data(outData, addr, size);
 }
 
 /**
  * エラーの時に -1 を返す、ってことするよりは
  * perror みたいにしたほうがわかりやすいかな。
+ *
+ * 現在は 3 個まで。
+ * 本当は、3個以上にすると task->param[] には アドレスが入り
+ * そのアドレスは メインメモリでアロケートされた int の集合。
  */
 int
 Task::add_param(int _param)
@@ -46,16 +50,16 @@
  * perror みたいにしたほうがわかりやすいかな。
  */
 int
-Task::add_data(ListDataPtr list, uint32 addr, int size)
+Task::add_data(ListData& list, uint32 addr, int size)
 {
-    if (list->length >= MAX_LIST_DMA_SIZE) return -1;
+    if (list.length >= MAX_LIST_DMA_SIZE) return -1;
 
-    list->bound[list->length] = list->size;
+    list.bound[list.length] = list.size;
 
     // size でも制限かけるべき?
-    list->size += size;
+    list.size += size;
 
-    ListElementPtr elm = &list->element[list->length++];
+    ListElementPtr elm = &list.element[list.length++];
     elm->addr = addr;
     elm->size = size;
 
--- a/TaskManager/kernel/ppe/Task.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/Task.h	Mon Oct 12 11:27:13 2009 +0900
@@ -7,23 +7,25 @@
 
 #define MAX_PARAMS 8
 
+class TaskQueue;
+
 class Task {
 public: // variables
 
     BASE_NEW_DELETE(Task);
 
     int command;         // 4 byte
-    ListDataPtr inData;  // 4 byte 64bit であるべき
-    ListDataPtr outData; // 4 byte 64bit であるべき
-    uint32 self;         // 4 byte
+    int self;         // 4 byte
 
     int param_size;        // 4 byte
     int param[MAX_PARAMS]; // 4*MAX_PARAMS byte
+    ListData inData  __attribute__ ((aligned (DEFAULT_ALIGNMENT)));  // 4 byte 64bit であるべき
+    ListData outData  __attribute__ ((aligned (DEFAULT_ALIGNMENT))); // 4 byte 64bit であるべき
 
 public: // functions
     int add_inData_t(unsigned int addr, int size);  // unsigned int ではなく 64bit
     int add_outData_t(unsigned int addr, int size); // unsigned int ではなく 64bit
-    int add_data(ListDataPtr list, unsigned int addr, int size);
+    int add_data(ListData &list, unsigned int addr, int size);
     int add_param(int param);
 
 #define add_inData(addr, size)			\
--- a/TaskManager/kernel/ppe/TaskListInfo.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskListInfo.cc	Mon Oct 12 11:27:13 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	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskListInfo.h	Mon Oct 12 11:27:13 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/TaskManager.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManager.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -90,3 +90,5 @@
 TaskManager::get_scheduler() {
     return m_impl->get_scheduler();
 }
+
+/* end */
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -13,7 +13,12 @@
 }
 
 TaskManagerImpl::TaskManagerImpl(int num)
-    : machineNum(num), activeTaskQueue(NULL), waitTaskQueue(NULL) {}
+    : machineNum(num) {
+    activeTaskQueue = new HTaskInfo();
+    waitTaskQueue = new HTaskInfo();
+    htaskImpl = waitTaskQueue ;             // any HTaskInfo
+    taskQueueImpl = new TaskQueueInfo(); 
+}
 
 /**
  * 一番最初に PPE で実行される systask_start
@@ -21,7 +26,7 @@
  * 番兵的な意味で実装
  */
 void
-TaskManagerImpl::systask_init(void)
+TaskManagerImpl::systask_init()
 {
     systask_register();
 
@@ -62,8 +67,9 @@
     m = taskQueueImpl->create(master);
     s = taskQueueImpl->create(slave);
 
-    master->wait_me = TaskQueue::append(master->wait_me, s);
-    slave->wait_i   = TaskQueue::append(slave->wait_i, m);
+    master->wait_me->addLast(s);
+    slave->wait_i->addLast(m);
+    s->waiter = m;
 }
 
 /**
@@ -76,7 +82,7 @@
 {
     // waiter // master
     // waitee // slave
-    if (task->wait_i == NULL) {
+    if (task->wait_i->empty()) {
         append_activeTask(task);
     } else {
         append_waitTask(task);
@@ -89,12 +95,9 @@
  * Task を実行可能キューに追加する
  */
 void
-TaskManagerImpl::append_activeTask(HTaskPtr task)
+TaskManagerImpl::append_activeTask(HTaskPtr q)
 {
-    TaskQueuePtr q;
-
-    q = taskQueueImpl->create(task);
-    activeTaskQueue = TaskQueue::append(activeTaskQueue, q);
+    activeTaskQueue->addLast(q);
 }
 
 /**
@@ -112,46 +115,41 @@
 /**
  * 終了したタスクから依存の処理とか
  * post_func() はこのタスクが終了したら実行する関数。
- * 今のところ使ってないっす
  *
  * @param [task] 終了したタスク
  */
 void
-TaskManagerImpl::check_task_finish(HTaskPtr task)
+TaskManagerImpl::check_task_finish(HTaskPtr me)
 {
-    notify_wait_taskQueue(task, task->wait_me);
-    task->post_func(task->post_arg);
-    htaskImpl->free(task);
+    // post_func を先に実行しないと、systask_finish が active_queue
+    // 移されてから、wait_for されるという事態が起きることがある。
+
+    me->post_func(me->post_arg);
+
+    while(TaskQueue *p = me->wait_me->poll()) {
+	HTaskPtr you = p->task;
+	TaskQueueInfo *wait_i = you->wait_i;
+	// 相手の wait queue から自分(を指しているTaskQueue)を削除
+	wait_i->remove(p->waiter);
+	// queue を free する
+	wait_i->free_(p->waiter);
+
+	if (wait_i->empty()) {
+	    waitTaskQueue->remove(you);
+	    append_activeTask(you);
+	}
+
+	wait_i->free_(p);
+    }
+
+    htaskImpl->free_(me);
 }
 
-/**
- * 終了したタスク [depend] を待っている TaskList に
- * 終わった事を知らせる(削除する
- */
-void
-TaskManagerImpl::notify_wait_taskQueue(HTaskPtr depend, TaskQueuePtr list)
-{
-    TaskQueuePtr p;
-    HTaskPtr task;
-
-    p = list; // wait task list
-
-    while (p) {
-        task = (HTaskPtr)p->task;
-        task->wait_i = remove_taskQueue_eq_task(task->wait_i, depend);
-        p = p->next;
-    }
-
-    remove_taskQueue_all(list);
-}
 
 void
-TaskManagerImpl::append_waitTask(HTaskPtr task)
+TaskManagerImpl::append_waitTask(HTaskPtr q)
 {
-    TaskQueuePtr q;
-
-    q = taskQueueImpl->create(task);
-    waitTaskQueue = TaskQueue::append(waitTaskQueue, q);
+    waitTaskQueue ->addLast(q);
 }
 
 /**
@@ -159,89 +157,9 @@
  * activeQueue へ移す
  */
 void
-TaskManagerImpl::wakeup_waitTask(void)
+TaskManagerImpl::wakeup_waitTask()
 {
-    TaskQueuePtr p, tmp;
-
-    p = waitTaskQueue;
-    while (p) {
-        HTaskPtr task = (HTaskPtr)p->task;
-        tmp = p;
-        p = p->next;
-        if (task->wait_i == NULL) {
-            append_activeTask(task);
-            waitTaskQueue = remove_taskQueue(waitTaskQueue, tmp);
-        }
-    }
-}
-
-void
-TaskManagerImpl::remove_taskQueue_all(TaskQueuePtr list)
-{
-    TaskQueuePtr p = list;
-    TaskQueuePtr p1;
-
-    while (p != NULL) {
-        p1 = p->next;
-        taskQueueImpl->free(p);
-        p = p1;
-    }
+  // done in check_task_finish   
 }
 
-/**
- * [list] が持つ queue->task の中に [task] と同じ奴があれば
- * 削除する。まあ remove_taskQueue() の HTask で比較するverです。
- * こういうのはオーバーロードでやるもんなのかな?
- */
-TaskQueuePtr
-TaskManagerImpl::remove_taskQueue_eq_task(TaskQueuePtr list, HTaskPtr task)
-{
-    TaskQueuePtr p = list;
-    TaskQueuePtr p1;
-
-    if (p == NULL) return p;
-
-    if (p->task == task) {
-        list = list->next;
-        taskQueueImpl->free(p);
-    } else {
-        p1 = p->next;
-        while (p1 && p1->task && p1->task != task) {
-            p1 = p1->next;
-            p = p->next;
-        }
-        if (p1) {
-            p->next = p1->next;
-            taskQueueImpl->free(p1);
-        }
-    }
-
-    return list;
-}
-
-TaskQueuePtr
-TaskManagerImpl::remove_taskQueue(TaskQueuePtr list, TaskQueuePtr q)
-{
-    TaskQueuePtr p = list;
-    TaskQueuePtr p1;
-
-    if (!p) return p;
-
-    if (p == q) {
-        list = list->next;
-        taskQueueImpl->free(p);
-    } else {
-        p1 = p->next;
-        while (p1 && p1 != q) {
-            p1 = p1->next;
-            p = p->next;
-        }
-        if (p1) {
-            p->next = p1->next;
-            taskQueueImpl->free(p1);
-        }
-    }
-
-    return list;
-}
-
+/* end */
--- a/TaskManager/kernel/ppe/TaskManagerImpl.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.h	Mon Oct 12 11:27:13 2009 +0900
@@ -11,35 +11,32 @@
 
 class TaskManagerImpl {
 public:
-    /* constructor */
-    TaskManagerImpl(int num = 1);
-    virtual ~TaskManagerImpl(void) {}
 
     /* variables */
     int machineNum;
-    TaskQueuePtr activeTaskQueue;
-    TaskQueuePtr waitTaskQueue;
+    HTaskInfo *activeTaskQueue;
+    HTaskInfo *waitTaskQueue;
 
-    /* variables */
     TaskListInfo *taskListImpl;
     TaskQueueInfo *taskQueueImpl;
     HTaskInfo *htaskImpl;
 
+    /* constructor */
+    TaskManagerImpl(int num = 1) ;
+
+    virtual ~TaskManagerImpl() { }
+
     /* functions */
     // system
-    virtual void init(void) = 0;
-    virtual void run(void) = 0;
+    virtual void init() = 0;
+    virtual void run() = 0;
     virtual void append_activeTask(HTaskPtr);
     virtual void append_waitTask(HTaskPtr);
 
     void check_task_finish(HTaskPtr task);
-    void notify_wait_taskQueue(HTaskPtr depend, TaskQueuePtr list);
-    TaskQueuePtr remove_taskQueue(TaskQueuePtr list, TaskQueuePtr task);
-    TaskQueuePtr remove_taskQueue_eq_task(TaskQueuePtr list, HTaskPtr task);
-    void remove_taskQueue_all(TaskQueuePtr list);
-    void wakeup_waitTask(void);
+    void wakeup_waitTask();
 
-    void systask_init(void);
+    void systask_init();
 
     // user
     HTaskPtr create_task(int cmd);
--- a/TaskManager/kernel/ppe/TaskQueue.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskQueue.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -1,21 +1,29 @@
 #include "TaskQueue.h"
 
-TaskQueue::TaskQueue(TaskPtr q)
+TaskQueue::TaskQueue(HTask *q)
 {
     task = q;
     next = NULL;
+    prev = NULL;
+    waiter = NULL;
 }
 
+/*
+ *  こんなものは使いたくないが、renew task/task group が
+ *  が、あまりに ad-hoc で直し切れないので、とりあえず、
+ *  存続。TaskQueueInfo は SchedTask で使うにはでかすぎる。
+ */
 TaskQueuePtr
 TaskQueue::append(TaskQueuePtr list, TaskQueuePtr q)
 {
     TaskQueuePtr p = list;
 
     if (!p) {
-	return q;
+       return q;
     } else {
-	while(p->next) p = p->next;
-	p->next = q;
-	return list;
+       while(p->next) p = p->next;
+       p->next = q;
+       return list;
     }
 }
+
--- a/TaskManager/kernel/ppe/TaskQueue.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskQueue.h	Mon Oct 12 11:27:13 2009 +0900
@@ -2,20 +2,23 @@
 #define INCLUDED_TASK_QUEUE
 
 #include "base.h"
-#include "Task.h"
 
-#include <stdio.h>
+class HTask;
 
 class TaskQueue {
 public:
-    TaskQueue(TaskPtr q = NULL);
+    TaskQueue(HTask *q = NULL);
 
     BASE_NEW_DELETE(TaskQueue);
 
-    TaskPtr task;
-    class TaskQueue *next;
+    HTask *task;
+    TaskQueue *waiter;
 
     static TaskQueue* append(TaskQueue* list, TaskQueue* q);
+
+    TaskQueue *next;
+    TaskQueue *prev;
+
 };
 
 typedef TaskQueue* TaskQueuePtr;
--- a/TaskManager/kernel/ppe/TaskQueueInfo.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskQueueInfo.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -2,87 +2,193 @@
 #include <stdlib.h>
 #include "TaskQueueInfo.h"
 
-TaskQueueInfo::TaskQueueInfo(void)
-    :taskQueuePool(NULL), freeTaskQueue(NULL) {}
-
-TaskQueueInfo::~TaskQueueInfo(void) { destroy(); }
+// Singleton TaskQueue Pool
+TaskQueueInfo TaskQueueInfo::taskQueuePool;   
 
-int
-TaskQueueInfo::init(int num)
-{
-    if (taskQueuePool == NULL) {
-	return extend_pool(num);
+TaskQueueInfo::TaskQueueInfo() {
+    // 最初の一つは自分
+    first = last = this;
+    next = prev = this;
+    waiter = NULL;
+}
+
+void
+TaskQueueInfo::freePool() { 
+    for(TaskQueuePtr p = taskQueuePool.waiter; p; ) {
+	TaskQueuePtr next = p->waiter;
+	p->waiter = NULL;
+	free(p);
+	p = next;
     }
-    return 0;
 }
 
 int
 TaskQueueInfo::extend_pool(int num)
 {
-    TaskQueuePtr q = NULL;
-
-    q = (TaskQueuePtr)malloc(sizeof(TaskQueue)*(num+1));
+    TaskQueuePtr q = (TaskQueuePtr)malloc(sizeof(TaskQueue)*(num+1));
 
-    if (q == NULL) {
-	return -1;
-    }
-    q->next = taskQueuePool;
-    taskQueuePool = q;
+    // First Queue is previous pool
+    q->waiter = waiter; waiter = q;
+    q++;
 
     /* Connect all free queue in the pool */
-    for (q = taskQueuePool + 1; --num > 0; q++) {
-	q->next = q + 1;
+    TaskQueuePtr p = q;
+    for (; num-- > 0; p++) {
+	p->task = NULL;
+	p->waiter = NULL;
+	taskQueuePool.addLast(p);
     }
-    q->next = freeTaskQueue;
-    freeTaskQueue = taskQueuePool + 1;
 
     return 0;
 }
 
 TaskQueuePtr
-TaskQueueInfo::create(TaskPtr task)
+TaskQueueInfo::create(HTask *task)
 {
-    TaskQueuePtr q;
-
-    if (freeTaskQueue == NULL) {
-	extend_pool(100);
+    TaskQueuePtr q =  taskQueuePool.poll();
+    if (! q)  {
+	taskQueuePool.extend_pool(64);
+	q = taskQueuePool.poll();
     }
-    q = freeTaskQueue;
-    freeTaskQueue = freeTaskQueue->next;
-
+    q->next = q->prev = NULL;
+    q->waiter = NULL;
     q->task = task;
-    q->next = NULL;
 
     return q;
 }
 
 
 void
-TaskQueueInfo::free(TaskQueuePtr q)
+TaskQueueInfo::free_(TaskQueuePtr q)
 {
-    q->next = freeTaskQueue;
-    freeTaskQueue = q;
+    q->waiter = NULL;
+    q->task = NULL;
+    taskQueuePool.addLast(q);
 }
 
 
+/*!
+  TaskQueueInfo は空にならない。最低1個は要素が入っていて
+  1個目は特別扱いする。getFirst すると first->next を返す
+ */
+
+/*!
+  最初の1個は特別扱いなので、それの後に追加していく
+ */
 void
-TaskQueueInfo::destroy(void)
+TaskQueueInfo::addFirst(TaskQueue* e)
+{
+    e->prev = first;
+    e->next = first->next;
+    first->next->prev = e;
+    first->next = e;
+}
+
+void
+TaskQueueInfo::addLast(TaskQueue* e)
+{
+    e->next = first;
+    e->prev = last;
+    last->next = e;
+    last = e;
+}
+
+TaskQueue*
+TaskQueueInfo::getFirst()
 {
-    TaskQueuePtr q, tmp;
+    if (empty()) return NULL;
+    return first->next;
+}
+
+TaskQueue*
+TaskQueueInfo::getLast()
+{
+    if (empty()) return NULL;
+    return last;
+}
+
+int
+TaskQueueInfo::remove(TaskQueue* e)
+{
+    e->prev->next = e->next;
+    e->next->prev = e->prev;
+
+    if (first->next == e) {
+	first->next = e->next;
+    }
+    if (last == e) {
+	last = e->prev;
+    }
+
+    e->prev = NULL;
+    e->next = NULL;
+
+    return 1;
+}
 
-#if 1
-    q = taskQueuePool;
-    while (q) {
-	tmp = q->next;
-	free(q);
-	q = tmp;
+/*!
+  リストの先頭を取得および削除する。リストが空の場合は NULL を返す。
+ */
+
+TaskQueue*
+TaskQueueInfo::poll()
+{
+    TaskQueue* e = first->next;
+    if (e == this) {
+	return NULL;
     }
-#else
-    for (q = taskQueuePool; q; q = q->next) {
-	free(q);
+    remove(e);
+    return e;
+}
+
+void
+TaskQueueInfo::moveToFirst(TaskQueue* e)
+{
+    remove(e);
+    addFirst(e);
+}
+
+/*!
+  リスト内の指定された位置にある要素を返す。
+  要素数を超えた位置を指定した場合 NULL を返す。
+ */
+
+TaskQueue*
+TaskQueueInfo::get(int index)
+{
+    TaskQueue* e = first->next;
+    for (int i = 0; i < index; i++) {
+	if (e == this) return NULL;
+	e = e->next;
     }
-#endif
-    freeTaskQueue = taskQueuePool = NULL;
+    return e;
+}
+
+TaskQueue*
+TaskQueueInfo::find(HTask* task)
+{
+    TaskQueue* e = first->next;
+    for(;;) {
+	if (e == this) return NULL;
+	if (e->task == task) return e;
+	e = e->next;
+    }
+    return e;
+}
+
+int
+TaskQueueInfo::empty()
+{
+    return next == this;
+}
+
+TaskQueue*
+TaskQueueInfo::getNext(TaskQueue* q) 
+{
+    if (q->next==this) return NULL;
+    return q->next;
+}
 
 
-}
+
+/* end */
--- a/TaskManager/kernel/ppe/TaskQueueInfo.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/ppe/TaskQueueInfo.h	Mon Oct 12 11:27:13 2009 +0900
@@ -3,21 +3,43 @@
 
 #include "TaskQueue.h"
 
-class TaskQueueInfo {
+class HTask;
+
+class TaskQueueInfo : public TaskQueue {
+
+
 public:
     /* constructor */
     TaskQueueInfo();
-    ~TaskQueueInfo();
+
+    BASE_NEW_DELETE(TaskQueueInfo);
 
     /* functions */
-    int init(int num);
-    TaskQueuePtr create(TaskPtr task);
-    void free(TaskQueuePtr queue);
-    
+    TaskQueuePtr create(HTask *task);
+    void free_(TaskQueuePtr queue);
+
+    void addFirst(TaskQueue* e);
+    void addLast(TaskQueue* e);
+    TaskQueue* getFirst();
+    TaskQueue* getLast();
+    int remove(TaskQueue* e);
+    TaskQueue* poll();
+    void moveToFirst(TaskQueue* e); // or use();
+    TaskQueue* get(int index);
+    TaskQueue* find(HTask *task);
+    int empty();
+    void freePool() ;
+
+    // Iterator
+    TaskQueue* getNext(TaskQueue* q) ;
+    int hasNext(TaskQueue* q);
+
 private:
     /* variables */
-    TaskQueuePtr taskQueuePool;
-    TaskQueuePtr freeTaskQueue;
+
+    static TaskQueueInfo taskQueuePool;
+    TaskQueue* first;
+    TaskQueue* last;
 
     /* functions */
     int extend_pool(int num);
--- a/TaskManager/kernel/schedule/DmaManager.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/schedule/DmaManager.h	Mon Oct 12 11:27:13 2009 +0900
@@ -8,8 +8,8 @@
 enum dma_tag {
     DMA_READ  = 25,
     DMA_WRITE = 27,
-    DMA_READ_IN_LIST  = 29,
-    DMA_READ_OUT_LIST = 30,
+//    DMA_READ_IN_LIST  = 29,
+//    DMA_READ_OUT_LIST = 30,
     DMA_READ_TASKLIST = 31,
 };
 
--- a/TaskManager/kernel/schedule/SchedTask.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -39,17 +39,17 @@
 
 SchedTask::SchedTask()
 {
-    __list        = NULL;
-    __task        = NULL;
-    __inListData  = NULL;
-    __outListData = NULL;
-    __readbuf     = NULL;
-    __writebuf    = NULL;
-    __scheduler   = NULL;
-    __taskGroup   = NULL;
-    __renew_flag  = 0;
-    __cur_index   = 0;
-    __flag_renewTask = SCHED_TASK_NORMAL;
+    list        = NULL;
+    task        = NULL;
+    inListData  = NULL;
+    outListData = NULL;
+    readbuf     = NULL;
+    writebuf    = NULL;
+    scheduler   = NULL;
+    taskGroup   = NULL;
+    renew_flag  = 0;
+    cur_index   = 0;
+    flag_renewTask = SCHED_TASK_NORMAL;
     this->stdout_ = stdout;
     this->stderr_ = stderr;
     this->stdin_ = stdin;
@@ -64,26 +64,19 @@
 
 /**
  * dma_store の wait を行う
- * このタスクが RenewTask だった場合、
- * __inListData や __outListData は
- * Scheduler の持つ、使い回しの buffer ではなく
- * 新たに allocate されたものなので、ここで free する
  */
 SchedTask::~SchedTask()
 {
-    if (__flag_renewTask == SCHED_TASK_RENEW) {
-        free(__inListData);
-        free(__outListData);
-
+    if (flag_renewTask == SCHED_TASK_RENEW) {
         /**
-         * __list != NULL の場合、
-         * この Task が __list の最後の Task になるので (SchedTask::next 参照)
-         * このタイミングで __list を解放する
+         * list != NULL の場合、
+         * この Task が list の最後の Task になるので (SchedTask::next 参照)
+         * このタイミングで list を解放する
          *   (free に渡されるアドレスが正しいものとなる)。
          * それ以外の Task では当然解放しない。
-         *  __list == NULL なので、free に渡しても無問題
+         *  list == NULL なので、free に渡しても無問題
          */
-        free(__list);
+        free(list);
     }
 
 
@@ -93,9 +86,9 @@
  * このタスクを Renew Task とし、それに応じた関数をセットする
  */
 void
-SchedTask::__setRenew()
+SchedTask::setRenew()
 {
-    __flag_renewTask = SCHED_TASK_RENEW;
+    flag_renewTask = SCHED_TASK_RENEW;
 
     ex_init   = &SchedTask::ex_init_renew;
     ex_read   = &SchedTask::ex_read_renew;
@@ -105,17 +98,18 @@
 }
 
 void
-SchedTask::__init__(TaskListPtr _list, TaskPtr _task, int index,
-                    ListDataPtr rbuf, ListDataPtr wbuf, Scheduler* sc)
+SchedTask::init(TaskListPtr _list, TaskPtr _task, int index,
+                    // ListDataPtr rbuf, ListDataPtr wbuf, 
+		    Scheduler* sc)
 {
-    __list        = _list;
-    __task        = _task;
-    __inListData  = rbuf;
-    __outListData = wbuf;
-    __scheduler   = sc;
-    __cur_index   = index;
+    list        = _list;
+    task        = _task;
+    inListData  = &_task->inData;
+    outListData = &_task->outData;
+    scheduler   = sc;
+    cur_index   = index;
 
-    __scheduler->mainMem_wait();
+    scheduler->mainMem_wait();
 
     (this->*ex_init)();
 }
@@ -126,17 +120,21 @@
 void
 SchedTask::ex_init_normal()
 {
-    __scheduler->dma_load(__inListData, (uint32)__task->inData,
+#if 0
+    // task list に入れたので既に読んでいる?
+    //
+    scheduler->dma_load(inListData, (uint32)&task->inData,
                           sizeof(ListData), DMA_READ_IN_LIST);
-    __scheduler->dma_load(__outListData, (uint32)__task->outData,
+    scheduler->dma_load(outListData, (uint32)&task->outData,
                           sizeof(ListData), DMA_READ_OUT_LIST);
 #if defined(NO_PIPELINE)
-    __scheduler->dma_wait(DMA_READ_IN_LIST);
-    __scheduler->dma_wait(DMA_READ_OUT_LIST);
+    scheduler->dma_wait(DMA_READ_IN_LIST);
+    scheduler->dma_wait(DMA_READ_OUT_LIST);
+#endif
 #endif
 
-    __taskGroup = new TaskGroup;
-    __taskGroup->command = __task->self;
+    taskGroup = new TaskGroup;
+    taskGroup->command = (int)task->self;
 }
 
 /**
@@ -147,12 +145,20 @@
 void
 SchedTask::ex_init_renew()
 {
-    __inListData = __task->inData;
-    __outListData = __task->outData;
-    __taskGroup = (TaskGroupPtr)__task->self;
+    inListData = &task->inData;
+    outListData = &task->outData;
+    taskGroup = (TaskGroupPtr)task->self;
+}
+
+void
+SchedTask::read()
+{
+    (this->*ex_read)();
 }
 
 /**
+ * PPE 内で生成されたタスクの ex_read()
+ *
  * [Todo]
  *   データの読み込み場所を readbuf ではなく、
  *   ユーザ自身で決めれるようになるといいかもしれない。
@@ -162,29 +168,30 @@
  *   # もちろん管理はユーザに任せるわけだ。
  */
 void
-SchedTask::read()
+SchedTask::ex_read_normal()
 {
     __debug("[SchedTask:%s]\n", __FUNCTION__);
 
+#if 0
 #if !defined(NO_PIPELINE)
-    __scheduler->dma_wait(DMA_READ_IN_LIST);
-    __scheduler->dma_wait(DMA_READ_OUT_LIST);
+    scheduler->dma_wait(DMA_READ_IN_LIST);
+    scheduler->dma_wait(DMA_READ_OUT_LIST);
+#endif
 #endif
 
-    __writebuf = __scheduler->allocate(__outListData->size);
+    writebuf = scheduler->allocate(outListData->size);
 
     // 読むデータが一つもなければ無視
-    if (__inListData->length == 0) return;
+    if (inListData->length == 0) return;
 
     // load Input Data
-    __readbuf = __scheduler->allocate(__inListData->size);
-    __scheduler->dma_loadList(__inListData, __readbuf, DMA_READ);
+    readbuf = scheduler->allocate(inListData->size);
+    scheduler->dma_loadList(inListData, readbuf, DMA_READ);
 
 #if defined(NO_PIPELINE)
-    __scheduler->dma_wait(DMA_READ);
+    scheduler->dma_wait(DMA_READ);
 #endif
 
-    (this->*ex_read)();
 }
 
 void
@@ -193,28 +200,28 @@
     __debug("[SchedTask:%s]\n", __FUNCTION__);
 
 #if !defined(NO_PIPELINE)
-    __scheduler->dma_wait(DMA_READ);
-    task_list[__task->command].wait(__scheduler,__task->command);
+    scheduler->dma_wait(DMA_READ);
+    task_list[task->command].wait(scheduler,task->command);
 #endif
 
-    task_list[__task->command].run(this, __readbuf, __writebuf);
+    task_list[task->command].run(this, readbuf, writebuf);
 
-    free(__readbuf);
+    free(readbuf);
 
-    if (__taskGroup->status() != 0) {
-        __task->self = __taskGroup->command;
-        delete __taskGroup;
-        __taskGroup = NULL;
+    if (taskGroup->status() != 0) {
+        task->self = (int)taskGroup->command;
+        delete taskGroup;
+        taskGroup = NULL;
     }
 
 
     // 書き込む領域がなければ無視
-    if (__outListData->length > 0) {
-        __scheduler->dma_storeList(__outListData, __writebuf, DMA_WRITE);
+    if (outListData->length > 0) {
+        scheduler->dma_storeList(outListData, writebuf, DMA_WRITE);
 
 #if defined(NO_PIPELINE)
-        __scheduler->dma_wait(DMA_WRITE);
-        free(__writebuf);
+        scheduler->dma_wait(DMA_WRITE);
+        free(writebuf);
 #endif
     }
 
@@ -227,22 +234,15 @@
     __debug("[SchedTask:%s]\n", __FUNCTION__);
 
 #if !defined(NO_PIPELINE)
-    __scheduler->dma_wait(DMA_WRITE);
-    free(__writebuf);
+    scheduler->dma_wait(DMA_WRITE);
+    free(writebuf);
 #endif
 
-    if (__task->self == MY_SPE_NOP) return;
+    if ((int)task->self == MY_SPE_NOP) return;
 
     (this->*ex_write)();
 }
 
-/**
- * PPE 内で生成されたタスクの ex_read()
- */
-void
-SchedTask::ex_read_normal()
-{
-}
 
 /**
  * SPE 内で生成されたタスクの ex_read()
@@ -250,6 +250,7 @@
 void
 SchedTask::ex_read_renew()
 {
+    writebuf = scheduler->allocate(outListData->size);
 }
 
 /**
@@ -284,8 +285,8 @@
      * このタスク内で新たにタスクが生成されなかった
      * or 生成されたが、そのタスクの終了を待つ必要は無い
      */
-    if (__renew_flag == 0) {
-        __scheduler->mail_write(__task->self);
+    if (renew_flag == 0) {
+        scheduler->mail_write((int)task->self);
     }
 }
 
@@ -306,13 +307,13 @@
 {
     uint32 cmd;
 
-    __taskGroup->remove(__task);
-    cmd = __taskGroup->status();
+    taskGroup->remove(task);
+    cmd = taskGroup->status();
 
     // タスク内で作られた全てのタスクが終了した
     if (cmd != 0) {
-        delete __taskGroup;
-        __scheduler->mail_write(cmd);
+        delete taskGroup;
+        scheduler->mail_write(cmd);
     }
 }
 
@@ -329,36 +330,36 @@
 SchedTaskBase*
 SchedTask::ex_next_normal()
 {
-    if (__cur_index < __list->length) {
+    if (cur_index < list->length) {
         SchedTaskBase *nextSched;
 
-        nextSched = __scheduler->get_nextRenewTaskList();
+        nextSched = scheduler->get_nextRenewTaskList();
 
         // RenewTask がある
         if (nextSched) {
-            __scheduler->set_backupTaskList(__list);
-            __scheduler->set_backupTaskListIndex(__cur_index);
+            scheduler->set_backupTaskList(list);
+            scheduler->set_backupTaskListIndex(cur_index);
             return nextSched;
         } else {
-            TaskPtr nextTask = &__list->tasks[__cur_index++];
-	    if (__cur_index < __list->length) {
+            TaskPtr nextTask = &list->tasks[cur_index++];
+	    if (cur_index < list->length) {
 		// load next task
-		loadSchedTask(__scheduler, &__list->tasks[__cur_index]);
+		loadSchedTask(scheduler, &list->tasks[cur_index]);
 	    }
-            nextSched = createSchedTask(__scheduler, nextTask);
-            ((SchedTask*)nextSched)->__init__(__list, nextTask, __cur_index,
-                                              __scheduler->get_curReadBuf(),
-                                              __scheduler->get_curWriteBuf(),
-                                              __scheduler);
+            nextSched = createSchedTask(scheduler, nextTask);
+            ((SchedTask*)nextSched)->init(list, nextTask, cur_index,
+                                              // scheduler->get_curReadBuf(),
+                                              // scheduler->get_curWriteBuf(),
+                                              scheduler);
             return nextSched;
         }
     } else {
-        uint32 nextList = (uint32)__list->next;
+        uint32 nextList = (uint32)list->next;
 
         if (nextList == 0) {
-            return new SchedNop2Ready(__scheduler);
+            return new SchedNop2Ready(scheduler);
         } else {
-            return createSchedTaskList(nextList, __scheduler,
+            return createSchedTaskList(nextList, scheduler,
                                        SCHED_TASKLIST_NORMAL);
         }
     }
@@ -373,54 +374,54 @@
     TaskPtr nextTask;
     SchedTask *nextSched;
 
-    if (__cur_index < __list->length) {
-        nextTask = &__list->tasks[__cur_index++];
-	if (__cur_index < __list->length) {
+    if (cur_index < list->length) {
+        nextTask = &list->tasks[cur_index++];
+	if (cur_index < list->length) {
 	    // load next task
-	    loadSchedTask(__scheduler, &__list->tasks[__cur_index]);
+	    loadSchedTask(scheduler, &list->tasks[cur_index]);
 	}
-        nextSched = createSchedTask(__scheduler, nextTask);
+        nextSched = createSchedTask(scheduler, nextTask);
 
         // RenewTaskList を実行中なので
-        nextSched->__setRenew();
-        nextSched->__init__(__list, nextTask, __cur_index,
-                            __scheduler->get_curReadBuf(),
-                            __scheduler->get_curWriteBuf(),
-                            __scheduler);
+        nextSched->setRenew();
+        nextSched->init(list, nextTask, cur_index,
+                            // scheduler->get_curReadBuf(),
+                            // scheduler->get_curWriteBuf(),
+                            scheduler);
 
         /**
          * この理由は SchedTask:~SchedTask() で
          */
-        __list = NULL;
+        list = NULL;
         return nextSched;
     } else {
         SchedTaskBase *nextList;
 
-        nextList = __scheduler->get_nextRenewTaskList();
+        nextList = scheduler->get_nextRenewTaskList();
 
         if (nextList) {
             return nextList;
         } else {
-            TaskListPtr nextList = __scheduler->get_backupTaskList();
+            TaskListPtr nextList = scheduler->get_backupTaskList();
 
             // 中断した TaskList がある
             if (nextList) {
-                __cur_index = __scheduler->get_backupTaskListIndex();
+                cur_index = scheduler->get_backupTaskListIndex();
 
-                nextTask = &nextList->tasks[__cur_index++];
-		if (__cur_index < __list->length) {
+                nextTask = &nextList->tasks[cur_index++];
+		if (cur_index < list->length) {
 		    // load next task
-		    loadSchedTask(__scheduler, &__list->tasks[__cur_index]);
+		    loadSchedTask(scheduler, &list->tasks[cur_index]);
 		}
-                nextSched = createSchedTask(__scheduler, nextTask);
+                nextSched = createSchedTask(scheduler, nextTask);
 
-                nextSched->__init__(nextList, nextTask, __cur_index,
-                                    __scheduler->get_curReadBuf(),
-                                    __scheduler->get_curWriteBuf(),
-                                    __scheduler);
+                nextSched->init(nextList, nextTask, cur_index,
+                                    // scheduler->get_curReadBuf(),
+                                    // scheduler->get_curWriteBuf(),
+                                    scheduler);
                 return nextSched;
             } else {
-                return new SchedNop2Ready(__scheduler);
+                return new SchedNop2Ready(scheduler);
             }
         }
     }
@@ -429,7 +430,7 @@
 int
 SchedTask::get_cpuid()
 {
-    return __scheduler->id;
+    return scheduler->id;
 }
 
 /**
@@ -440,7 +441,7 @@
 SchedTask::get_input(void *buff, int index)
 {
     if (buff != NULL) {
-        return (void*)((int)buff + __inListData->bound[index]);
+        return (void*)((int)buff + inListData->bound[index]);
     } else {
         return NULL;
     }
@@ -452,7 +453,7 @@
 uint32
 SchedTask::get_inputAddr(int index)
 {
-    return __inListData->element[index].addr;
+    return inListData->element[index].addr;
 }
 
 /**
@@ -461,7 +462,7 @@
 int
 SchedTask::get_inputSize(int index)
 {
-    return __inListData->element[index].size;
+    return inListData->element[index].size;
 }
 
 /**
@@ -471,7 +472,7 @@
 SchedTask::get_output(void *buff, int index)
 {
     if (buff != NULL) {
-        return (void*)((int)buff + __outListData->bound[index]);
+        return (void*)((int)buff + outListData->bound[index]);
     } else {
         return NULL;
     }
@@ -483,7 +484,7 @@
 uint32
 SchedTask::get_outputAddr(int index)
 {
-    return __outListData->element[index].addr;
+    return outListData->element[index].addr;
 }
 
 /**
@@ -492,126 +493,125 @@
 int
 SchedTask::get_outputSize(int index)
 {
-    return __outListData->element[index].size;
+    return outListData->element[index].size;
 }
 
 int
 SchedTask::get_param(int index)
 {
-    return __task->param[index];
+    return task->param[index];
 }
 
 TaskPtr
 SchedTask::create_task(int cmd)
 {
-    TaskListPtr taskList = __scheduler->get_renewListBuf();
+    TaskListPtr taskList = scheduler->get_renewListBuf();
     TaskPtr p = &taskList->tasks[taskList->length++];
     p->command = cmd;
 
-    p->inData = (ListData*)__scheduler->allocate(sizeof(ListData));
-    p->outData = (ListData*)__scheduler->allocate(sizeof(ListData));
+    // already allocated 
+    // p->inData = (ListData*)scheduler->allocate(sizeof(ListData));
+    // p->outData = (ListData*)scheduler->allocate(sizeof(ListData));
 
-    p->inData->clear();
-    p->outData->clear();
+    p->inData.clear();
+    p->outData.clear();
 
-    p->self = MY_SPE_NOP;
+    p->self = (int)MY_SPE_NOP;
     p->param_size = 0;
 
     return p;
 }
 
 /**
- * 生成したタスクが終了してから、メインスケジューラ(PPE) に
- * タスクが終了した旨を知らせる。
  *
- * @param[in] waitTask タスク内で生成したタスク
+ * @param[in] waitTask タスク内で生成したタスクの登録(spawn()に相当)
  */
 void
 SchedTask::wait_task(TaskPtr waitTask)
 {
-    waitTask->self = (uint32)__taskGroup;
+    waitTask->self = (int)taskGroup;
 
-    __scheduler->add_groupTask(__taskGroup, waitTask);
+    scheduler->add_groupTask(taskGroup, waitTask);
 
-    __renew_flag++;
+    renew_flag++;
 }
 
 void*
 SchedTask::global_alloc(int id, int size) {
-    return __scheduler->global_alloc(id, size);
+    return scheduler->global_alloc(id, size);
 }
 
 void*
 SchedTask::global_get(int id) {
-    return __scheduler->global_get(id);
+    return scheduler->global_get(id);
 }
 
 void
 SchedTask::global_set(int id, void *addr) {
-    __scheduler->global_set(id, addr);
+    scheduler->global_set(id, addr);
 }
 
 void
 SchedTask::global_free(int id) {
-    __scheduler->global_free(id);
+    scheduler->global_free(id);
 }
 
 MemList*
 SchedTask::createMemList(int size, int count) {
-    return __scheduler->createMemList(size, count);
+    return scheduler->createMemList(size, count);
 }
 
 void
 SchedTask::mainMem_alloc(int id, int size) {
-    __scheduler->mainMem_alloc(id, size);
+    scheduler->mainMem_alloc(id, size);
 }
 
 void
 SchedTask::mainMem_wait() {
-    __scheduler->mainMem_wait();
+    scheduler->mainMem_wait();
 }
 
 void*
 SchedTask::mainMem_get(int id) {
-    return __scheduler->mainMem_get(id);
+    return scheduler->mainMem_get(id);
 }
 
 void*
 SchedTask::allocate(int size) {
-    return __scheduler->allocate(size);
+    return scheduler->allocate(size);
 }
 
 
 void
 SchedTask::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) {
-    __scheduler->dma_load(buf, addr, size, mask);
+    scheduler->dma_load(buf, addr, size, mask);
 }
 
 void
 SchedTask::dma_store(void *buf,uint32 addr, uint32 size, uint32 mask) {
-    __scheduler->dma_store(buf, addr, size, mask);
+    scheduler->dma_store(buf, addr, size, mask);
 }
 
 void
 SchedTask::dma_wait(uint32 mask) {
-    __scheduler->dma_wait(mask);
+    scheduler->dma_wait(mask);
 }
 
 void
 SchedTask::show_dma_wait() {
-    __scheduler->show_dma_wait();
+    scheduler->show_dma_wait();
 }
 
 MemorySegment * SchedTask::get_segment(memaddr addr, MemList *m) {
-    return __scheduler->get_segment(addr,m);
+    return scheduler->get_segment(addr,m);
 }
 
 void SchedTask::put_segment(MemorySegment *s) {
-    __scheduler->put_segment(s);
+    scheduler->put_segment(s);
 }
 
 void SchedTask::wait_segment(MemorySegment *s) {
-    __scheduler->wait_segment(s);
+    scheduler->wait_segment(s);
 }
 
 /* system call */
--- a/TaskManager/kernel/schedule/SchedTask.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTask.h	Mon Oct 12 11:27:13 2009 +0900
@@ -22,15 +22,15 @@
     /* variables */
 
     // Task を実行するスケジューラ自身
-    Scheduler *__scheduler;
+    Scheduler *scheduler;
     
     // 現在スケジューラが実行している TaskList と、このタスクに対応する Task
-    TaskListPtr __list;
-    TaskPtr __task;
+    TaskListPtr list;
+    TaskPtr task;
 
     // read/write 用の ListData
-    ListDataPtr __inListData;
-    ListDataPtr __outListData;
+    ListDataPtr inListData;
+    ListDataPtr outListData;
 
     /**
      * read データ、write 用のバッファ
@@ -38,24 +38,24 @@
      * writebuf にデータを描き込んでおくと、
      * タスク登録時に設定した出力先に書き込む
      */
-    void *__readbuf;
-    void *__writebuf;
+    void *readbuf;
+    void *writebuf;
 
     // Task の、Tasklist での位置。(task = &list[cur_index-1])
-    int __cur_index;
+    int cur_index;
 
     // タスク内で生成されたタスクのグループ
-    TaskGroup *__taskGroup;
+    TaskGroup *taskGroup;
 
     // このタスク内で生成されたタスクの数
-    int __renew_flag;
+    int renew_flag;
 
     // このタスクが SPE 内で生成されたタスクか否か 1: Yes, 0: No
-    int __flag_renewTask;
+    int flag_renewTask;
 
     // タスクがメインメモリ側で生成されたものか、
     // SPE で生成されたものかによって、データの扱いが変わってくる。
-    // そのために if (__flag_renewTask) を連発するのはよくないので
+    // そのために if (flag_renewTask) を連発するのはよくないので
     // 関数ポインタで持っておく
     void (SchedTask::*ex_init)();
     void (SchedTask::*ex_read)();
@@ -78,7 +78,7 @@
 
     /**
      * PPE で生成されたタスクに対する
-     * __init__, read,exec,write,next の付属(?)処理
+     * init, read,exec,write,next の付属(?)処理
      */
     void ex_init_normal();
     void ex_read_normal();
@@ -88,7 +88,7 @@
 
     /**
      * SPE で生成されたタスクに対する
-     * __inti__, ead,exec,write,next の付属(?)処理
+     * inti, ead,exec,write,next の付属(?)処理
      */
     void ex_init_renew();
     void ex_read_renew();
@@ -99,9 +99,10 @@
 public:
     /* functions */
 
-    void __setRenew();
-    void __init__(TaskListPtr _list, TaskPtr _task, int index,
-                  ListDataPtr rbuf, ListDataPtr wbuf, Scheduler* sc);
+    void setRenew();
+    void init(TaskListPtr _list, TaskPtr _task, int index,
+                    // ListDataPtr rbuf, ListDataPtr wbuf, 
+		    Scheduler* sc);
 
     //---  User API ---
     int get_cpuid();
@@ -136,7 +137,7 @@
 
     void *allocate(int size);
     void free_(void *p) {
-	__scheduler->free_(p);
+	scheduler->free_(p);
     }
 
     void dma_load(void *buf, uint32 addr, uint32 size, uint32 mask);
@@ -149,11 +150,11 @@
      */
 
     void* get_input(int index) {
-      return get_input(__readbuf, index);
+      return get_input(readbuf, index);
     }
 
     void* get_output(int index) {
-      return get_output(__writebuf, index);
+      return get_output(writebuf, index);
     }
 
     /* system call */
--- a/TaskManager/kernel/schedule/SchedTaskList.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/schedule/SchedTaskList.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -77,12 +77,12 @@
 	nextSched = createSchedTask(scheduler, nextTask);
 
 	if (flag_renewTaskList == SCHED_TASKLIST_RENEW) {
-	    ((SchedTask*)nextSched)->__setRenew();
+	    ((SchedTask*)nextSched)->setRenew();
 	}
 	
-	((SchedTask*)nextSched)->__init__(list, nextTask, 1,
-					  scheduler->get_curReadBuf(),
-					  scheduler->get_curWriteBuf(),
+	((SchedTask*)nextSched)->init(list, nextTask, 1,
+					  // scheduler->get_curReadBuf(),
+					  // scheduler->get_curWriteBuf(),
 					  scheduler);
     }
 
--- a/TaskManager/kernel/schedule/Scheduler.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -12,7 +12,7 @@
 
 Scheduler::TaskObject task_list[MAX_TASK_OBJECT];
 
-Scheduler::~Scheduler(void)
+Scheduler::~Scheduler()
 {
     delete connector;
 }
@@ -21,20 +21,20 @@
  */
 
 void
-Scheduler::init(void)
+Scheduler::init()
 {
     hash = 0;
     init_impl();
 
     for (int i = 0; i < 2; i++) {
         buff_taskList[i]    = (TaskListPtr)allocate(sizeof(TaskList));
-        buff_inListData[i]  = (ListDataPtr)allocate(sizeof(ListData));
-        buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData));
+        // buff_inListData[i]  = (ListDataPtr)allocate(sizeof(ListData));
+        // buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData));
     }
 
     buffFlag_taskList = 0;
-    buffFlag_inListData = 0;
-    buffFlag_outListData = 0;
+    // buffFlag_inListData = 0;
+    // buffFlag_outListData = 0;
     flag_renewTaskList = 0;
 
     // bzero でもいいけど
@@ -50,10 +50,11 @@
     taskGroup = new TaskGroup;
     renewTop_taskList = NULL;
     renewCur_taskList = NULL;
+    bak_curTaskList = NULL;
 }
 
 void
-Scheduler::run(void)
+Scheduler::run()
 {
     task1 = new SchedNop();
     task2 = new SchedNop();
@@ -78,14 +79,14 @@
 
 
 void
-Scheduler::finish(void)
+Scheduler::finish()
 {
     free(buff_taskList[0]);
     free(buff_taskList[1]);
-    free(buff_inListData[0]);
-    free(buff_inListData[1]);
-    free(buff_outListData[0]);
-    free(buff_outListData[1]);
+    // free(buff_inListData[0]);
+    // free(buff_inListData[1]);
+    // free(buff_outListData[0]);
+    // free(buff_outListData[1]);
 }
 
 /**
@@ -93,7 +94,7 @@
  * パイプラインの各処理が交代して使う。
  */
 TaskListPtr
-Scheduler::get_curListBuf(void)
+Scheduler::get_curListBuf()
 {
     buffFlag_taskList ^= 1;
 
@@ -102,11 +103,15 @@
 
 
 /**
+ * Task に inListData, outListData を入れたので、
+ * これは必要ないらしい。
+ *
  * あらかじめ memory allocte してある ListData の領域を
  * パイプラインの各処理が交代して使う。
  */
+#if 0
 ListDataPtr
-Scheduler::get_curWriteBuf(void)
+Scheduler::get_curWriteBuf()
 {
     buffFlag_outListData ^= 1;
     return buff_outListData[buffFlag_outListData];
@@ -114,11 +119,12 @@
 
 
 ListDataPtr
-Scheduler::get_curReadBuf(void)
+Scheduler::get_curReadBuf()
 {
     buffFlag_inListData ^= 1;
     return buff_inListData[buffFlag_inListData];
 }
+#endif
 
 /**
  * タスク内で生成されたタスクを格納する TaskList を取得する
@@ -130,7 +136,7 @@
  * 以上の場合です
  */
 TaskListPtr
-Scheduler::get_renewListBuf(void)
+Scheduler::get_renewListBuf()
 {
     if (renewCur_taskList && renewCur_taskList->length < TASK_MAX_SIZE) {
         return renewCur_taskList;
@@ -153,7 +159,7 @@
  * @return next RenewTaskList
  */
 SchedTaskList*
-Scheduler::get_nextRenewTaskList(void)
+Scheduler::get_nextRenewTaskList()
 {
     if (renewTop_taskList) {
         TaskListPtr list  = renewTop_taskList;
@@ -188,7 +194,7 @@
  * @return TaskList
  */
 TaskListPtr
-Scheduler::get_backupTaskList(void)
+Scheduler::get_backupTaskList()
 {
     TaskListPtr ret = bak_curTaskList;
 
@@ -197,7 +203,7 @@
 }
 
 int
-Scheduler::get_backupTaskListIndex(void)
+Scheduler::get_backupTaskListIndex()
 {
     int ret = bakIndex_taskList;
 
@@ -243,7 +249,7 @@
 }
 
 uint32
-Scheduler::mail_read(void)
+Scheduler::mail_read()
 {
     return connector->mail_read();
 }
@@ -272,7 +278,7 @@
 }
 
 void
-Scheduler::reload_groupTask(void)
+Scheduler::reload_groupTask()
 {
     taskGroup = new TaskGroup;
 }
--- a/TaskManager/kernel/schedule/Scheduler.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.h	Mon Oct 12 11:27:13 2009 +0900
@@ -35,12 +35,12 @@
 
     // double buffering
     TaskListPtr buff_taskList[2];
-    ListDataPtr buff_inListData[2];
-    ListDataPtr buff_outListData[2];
+    // ListDataPtr buff_inListData[2];
+    // ListDataPtr buff_outListData[2];
 
     int buffFlag_taskList;
-    int buffFlag_inListData;
-    int buffFlag_outListData;
+    // int buffFlag_inListData;
+    // int buffFlag_outListData;
 
     /* TaskList 関連 */
 
@@ -121,8 +121,8 @@
     void finish();
 
     TaskListPtr get_curListBuf();
-    ListDataPtr get_curReadBuf();
-    ListDataPtr get_curWriteBuf();
+    // ListDataPtr get_curReadBuf();
+    // ListDataPtr get_curWriteBuf();
     TaskListPtr get_renewListBuf();
 
     void set_backupTaskList(TaskListPtr cur_taskList);
--- a/TaskManager/kernel/schedule/TaskGroup.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/schedule/TaskGroup.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -1,21 +1,24 @@
 #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;
+    q->task = add_task;
+    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 +27,7 @@
 	}
 	if (p1) {
 	    p->next = p1->next;
-	    delete p1;
+	    free( p1);
 	}
     }
 }
@@ -36,7 +39,7 @@
  * command を返す。
  */
 unsigned int
-TaskGroup::status(void) {
+TaskGroup::status() {
     /**                                                                     
      * bool の                                                              
      *  true == 1;                                                          
--- a/TaskManager/kernel/schedule/TaskGroup.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/TaskManager/kernel/schedule/TaskGroup.h	Mon Oct 12 11:27:13 2009 +0900
@@ -2,16 +2,23 @@
 #define INCLUDED_TASK_GROUP
 
 #include "base.h"
-#include "TaskQueue.h"
+#include "Task.h"
 
 class TaskGroup {
 public:
-    TaskGroup(void): group(NULL) {}
+
+    struct groupQueue {
+	struct groupQueue *next;
+	TaskPtr task;
+    } *group;
+
+    TaskGroup(): group(NULL) {}
 
     BASE_NEW_DELETE(TaskGroup);
 
+    // この command を引き渡すだけのためのオブジェクトらしい
+
     unsigned int command;
-    TaskQueuePtr group;
 
     /**
      * 待つ Task を追加
@@ -28,7 +35,7 @@
      * PPE に送るべきコマンドを返す。
      * まだ待つべきタスクがある場合は 0 を返す
      */
-    unsigned int status(void);
+    unsigned int status();
 };
 
 typedef TaskGroup* TaskGroupPtr;
--- a/example/dependency_task/main.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/example/dependency_task/main.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -16,7 +16,7 @@
 void
 run_start(TaskManager *manager)
 {
-    HTaskPtr t_exec;
+    HTaskPtr t_exec[2];
     HTaskPtr t_print;
 
     idata = (int*)manager->allocate(sizeof(int)*length*2);
@@ -31,21 +31,23 @@
 
     // idata を二つに分けて計算する
     for (int i = 0; i < 2; i++) {
-	t_exec = manager->create_task(TASK_EXEC);
-	t_exec->add_inData(&idata[length*i], sizeof(int)*length);
-	t_exec->add_outData(&idata[length*i], sizeof(int)*length);
-	t_exec->add_param(length);
-	t_exec->add_param(13*(i+1));
-	t_exec->set_cpu(SPE_ANY);
+	t_exec[i] = manager->create_task(TASK_EXEC);
+	t_exec[i]->add_inData(&idata[length*i], sizeof(int)*length);
+	t_exec[i]->add_outData(&idata[length*i], sizeof(int)*length);
+	t_exec[i]->add_param(length);
+	t_exec[i]->add_param(13*(i+1));
+	t_exec[i]->set_cpu(SPE_ANY);
 
 	if (depend_flg)
-	    t_print->wait_for(t_exec);
-	
-	t_exec->spawn();
+	    t_print->wait_for(t_exec[i]);
     }
 
     // add Active Queue
     t_print->spawn();
+
+    for (int i = 0; i < 2; i++) {
+	t_exec[i]->spawn();
+    }
 }
 
 int
--- a/example/renew_task/Func.h	Mon Oct 12 11:26:17 2009 +0900
+++ b/example/renew_task/Func.h	Mon Oct 12 11:27:13 2009 +0900
@@ -1,5 +1,6 @@
 enum {
     RENEW_START = 0,
+    RENEW_REPEAT,
     RENEW1,
     RENEW2,
     RENEW3,
--- a/example/renew_task/main.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/example/renew_task/main.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -8,24 +8,70 @@
 
 const char *usr_help_str = "Usage: ./renew_task";
 
+SchedDefineTask(RenewRepeat);
+
+static int count = 1;
+static int task_count = 1;
+
+static void
+renewRepeat(void *arg)
+{
+    TaskManager *manager = (TaskManager *)arg;
+
+    if (count-->0) {
+	HTask *repeat = manager->create_task(RENEW_REPEAT);
+	repeat->set_post(renewRepeat, (void*)manager);
+	repeat->spawn();
+
+	HTask *renew;
+
+	printf("[PPE] Create Task : RenewStart\n\n");
+
+	for(int i=0;i<task_count;i++) {
+	    renew = manager->create_task(RENEW_START);
+	    renew->set_cpu(SPE_ANY);
+	    renew->add_param(i);
+
+	    // add Active Queue
+	    renew->spawn();    
+	}
+    }
+}
+
+static int
+run(SchedTask *s, void *rbuf, void *wbuf)
+{
+    // RewnewRepeat Task
+    return 0;
+}
+
 static int
 init(int argc, char **argv)
 {
+    for (int i = 1; argv[i]; ++i) {
+        if (strcmp(argv[i], "-count") == 0) {
+            count = atoi(argv[++i]);
+        } else if (strcmp(argv[i], "-task") == 0) {
+            task_count = atoi(argv[++i]);
+        }
+
+
+    }
     return 0;
 }
 
 static void
 renew_init(TaskManager *manager)
 {
-    HTask *renew;
+    HTask *repeat;
 
-    printf("[PPE] Create Task : RenewStart\n\n");
+    printf("[PPE] Create Task : RenewRepeat\n\n");
 
-    renew = manager->create_task(RENEW_START);
-    renew->set_cpu(SPE_ANY);
+    repeat = manager->create_task(RENEW_REPEAT);
+    repeat->set_post(renewRepeat, (void*)manager);
 
     // add Active Queue
-    renew->spawn();    
+    repeat->spawn();    
 }
 
 int
--- a/example/renew_task/ppe/RenewStart.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/example/renew_task/ppe/RenewStart.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -5,10 +5,14 @@
 /* これは必須 */
 SchedDefineTask(RenewStart);
 
+
 static int
 run(SchedTask *s, void *rbuf, void *wbuf)
 {
-    s->printf("[PPE] ** running RenewStart\n");
+    int id;
+    id = s->get_param(0);
+
+    s->printf("[PPE] ** running RenewStart %d\n", id);
 
     s->printf("[PPE] Create Task : Renew1\n");
     TaskPtr nextTask =  s->create_task(RENEW1);
--- a/example/renew_task/ppe/task_init.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/example/renew_task/ppe/task_init.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -2,6 +2,7 @@
 #include "Scheduler.h"
 
 /* 必ずこの位置に書いて */
+SchedExternTask(RenewRepeat);
 SchedExternTask(RenewStart);
 SchedExternTask(Renew1);
 SchedExternTask(Renew2);
@@ -18,6 +19,7 @@
 task_init(void)
 {
     SchedRegisterTask(RENEW_START, RenewStart);
+    SchedRegisterTask(RENEW_REPEAT, RenewRepeat);
     SchedRegisterTask(RENEW1, Renew1);
     SchedRegisterTask(RENEW2, Renew2);
     SchedRegisterTask(RENEW3, Renew3);
--- a/example/renew_task/spe/Renew1.cc	Mon Oct 12 11:26:17 2009 +0900
+++ b/example/renew_task/spe/Renew1.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -13,7 +13,7 @@
     profile->ProfStop();
     profile->ProfPrint();
 
-    int *test_num = (int *)s->get_input(0);
+    int *test_num = (int *)s->get_input(rbuf,0);
     s->printf("[SPE] test_num = %d\n", *test_num);
 
     s->printf("[SPE] ** running Renew1\n");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/Func.h	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,5 @@
+enum {
+    HELLO_TASK,
+    RUN_FINISH,
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/Makefile	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,20 @@
+default: macosx
+
+macosx: FORCE
+	@echo "Make for Mac OS X"
+	@$(MAKE) -f Makefile.macosx
+
+linux: FORCE
+	@echo "Make for Linux"
+	@$(MAKE) -f Makefile.linux
+
+cell: FORCE
+	@echo "Make for PS3 (Cell)"
+	@$(MAKE) -f Makefile.cell
+
+FORCE:
+
+clean:
+	@$(MAKE) -f Makefile.macosx clean
+	@$(MAKE) -f Makefile.linux clean
+	@$(MAKE) -f Makefile.cell clean
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/Makefile.cell	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,42 @@
+include ./Makefile.def
+
+SRCS_TMP = $(wildcard *.cc)
+SRCS_EXCLUDE =  # ե
+SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
+OBJS = $(SRCS:.cc=.o)
+
+TASK_DIR  = ppe
+TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc)
+TASK_SRCS_EXCLUDE = 
+TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP))
+TASK_OBJS = $(TASK_SRCS:.cc=.o)
+
+LIBS += -lCellManager -lspe2 -lpthread -Wl,--gc-sections 
+
+.SUFFIXES: .cc .o
+
+.cc.o:
+	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+all: $(TARGET) speobject
+
+$(TARGET): $(OBJS) $(TASK_OBJS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+
+speobject:
+	cd spe; $(MAKE)
+
+run:
+	./$(TARGET) -cpu 6 
+
+link:
+	$(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS)
+
+debug: $(TARGET)
+	sudo ppu-gdb ./$(TARGET) 
+
+clean:
+	rm -f $(TARGET) $(OBJS) $(TASK_OBJS)
+	rm -f *~ \#*
+	rm -f ppe/*~ ppe/\#*
+	cd spe; $(MAKE) clean
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/Makefile.def	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,14 @@
+TARGET = task_queue
+
+# include/library path
+# ex: macosx
+#CERIUM = /Users/gongo/Source/Cerium
+
+# ex: linux/ps3
+CERIUM = ../../../Cerium
+
+CC      = g++
+CFLAGS  = -g -Wall -O9
+
+INCLUDE = -I${CERIUM}/include/TaskManager -I. -I..
+LIBS = -L${CERIUM}/TaskManager
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/Makefile.linux	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,36 @@
+include ./Makefile.def
+
+SRCS_TMP = $(wildcard *.cc)
+SRCS_EXCLUDE =  # ե
+SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
+OBJS = $(SRCS:.cc=.o)
+
+TASK_DIR  = ppe
+TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc)
+TASK_SRCS_EXCLUDE = 
+TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP))
+TASK_OBJS = $(TASK_SRCS:.cc=.o)
+
+LIBS += -lFifoManager
+
+.SUFFIXES: .cc .o
+
+.cc.o:
+	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+all: $(TARGET)
+
+$(TARGET): $(OBJS) $(TASK_OBJS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+
+link:
+	$(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS)
+
+debug: $(TARGET)
+	sudo gdb ./$(TARGET) 
+
+clean:
+	rm -f $(TARGET) $(OBJS) $(TASK_OBJS)
+	rm -f *~ \#*
+	rm -f ppe/*~ ppe/\#*
+	rm -f spe/*~ spe/\#*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/Makefile.macosx	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,36 @@
+include ./Makefile.def
+
+SRCS_TMP = $(wildcard *.cc)
+SRCS_EXCLUDE =  # ե
+SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
+OBJS = $(SRCS:.cc=.o)
+
+TASK_DIR  = ppe
+TASK_SRCS_TMP = $(wildcard $(TASK_DIR)/*.cc)
+TASK_SRCS_EXCLUDE = 
+TASK_SRCS = $(filter-out $(TASK_DIR)/$(TASK_SRCS_EXCLUDE),$(TASK_SRCS_TMP))
+TASK_OBJS = $(TASK_SRCS:.cc=.o)
+
+LIBS += -lFifoManager `sdl-config --libs`
+
+.SUFFIXES: .cc .o
+
+.cc.o:
+	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+all: $(TARGET)
+
+$(TARGET): $(OBJS) $(TASK_OBJS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+
+link:
+	$(CC) -o $(TARGET) $(OBJS) $(TASK_OBJS) $(LIBS)
+
+debug: $(TARGET)
+	sudo gdb ./$(TARGET) 
+
+clean:
+	rm -f $(TARGET) $(OBJS) $(TASK_OBJS)
+	rm -f *~ \#*
+	rm -f ppe/*~ ppe/\#*
+	rm -f spe/*~ spe/\#*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/README	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,4 @@
+Tue Oct  6 17:17:09 JST 2009
+
+TaskQueueu は、本来、内部で使う double linked list なので、
+ユーザには関係ない。ここでテストするのは変だが。
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/main.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,114 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "TaskManager.h"
+#include "Func.h"
+#include "main.h"
+
+extern void task_init(void);
+
+static int count = 1;
+
+extern TaskManager *manager;
+
+const char *usr_help_str = "Usage: ./hello [-cpu spe_num] [-count N]\n\
+  -cpu    Number of SPE (default 1) \n\
+  -count  Number of task is print \"Hello, World!!\"";
+
+int
+init(int argc, char **argv)
+{
+    for (int i = 1; argv[i]; ++i) {
+	if (strcmp(argv[i], "-count") == 0) {
+            count = atoi(argv[++i]);
+        }
+
+    }
+
+    return 0;
+}
+
+Queues queues;
+
+static void
+repeat(void *arg)
+{
+    static int count = 4;
+    QueuePtr q = (QueuePtr) arg;
+    TaskManager *manager = q->m;
+
+    if (count-->0) {
+        HTask *t = manager->create_task(HELLO_TASK);
+        t->set_post(repeat, arg);
+        t->add_param(q->i);
+        t->add_param((int)arg);
+        t->spawn();
+
+        printf("[PPE] Create Task : Hello count=%d id=%d\n\n",count, q->i);
+    } else {
+        printf("[PPE] End Task : Hello id=%d\n\n", q->i);
+    }
+}
+
+void
+hello_init(TaskManager *manager)
+{
+
+    if (count >MAX_QUEUE) return;
+
+    queues.m = manager;
+    queues.i = 0;
+    for (int i = 0; i < MAX_QUEUE; i++) {
+	TaskQueueInfo *q = new TaskQueueInfo() ;
+	queues.q[i] = q;
+    }
+
+    for (int i = 0; i < count; i++) {
+	/**
+	 * Create Task
+	 *   create_task(Task ID);
+	 */
+	HTask *hello = manager->create_task(HELLO_TASK);
+
+	/**
+	 * Select CPU
+	 *   SPE_0, SPE_1, SPE_2, SPE_3, SPE_4, SPE_5, SPE_ANY
+	 *   if you do not call this, execute PPE.
+	 */
+	hello->set_cpu(SPE_ANY);
+
+	/**
+	 * Set 32bits parameter
+	 *   add_param(32bit parameter);
+	 */
+	QueuePtr q = (QueuePtr) manager->allocate(sizeof(Queues));
+
+	q->i = i;
+	q->m = manager;
+	for (int j = 0; j < MAX_QUEUE; j++) {
+	    q->q[j] = queues.q[j];
+	}
+
+	hello->add_param(i);
+	hello->add_param((int)&queues);
+	hello->set_post(repeat, (void*) &queues);
+
+	hello->spawn();
+    }
+}
+
+int
+TMmain(TaskManager *manager, int argc, char *argv[])
+{
+    if (init(argc, argv) < 0) {
+	return -1;
+    }
+
+    // Task Register
+    //   ppe/task_init.cc
+    task_init();
+
+    hello_init(manager);
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/main.h	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,11 @@
+#include "TaskQueueInfo.h"
+#include "TaskManager.h"
+
+#define MAX_QUEUE 4
+
+typedef struct queues {
+    int i;
+    int j;
+    TaskManager *m;
+    TaskQueueInfo *q[MAX_QUEUE];
+} Queues, *QueuePtr;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/ppe/.#Hello.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,1 @@
+e065746@nakasone-hiroki-no-macbook.local.1456
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/ppe/Hello.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,56 @@
+#include <stdio.h>
+#include "SchedTask.h"
+#include "Hello.h"
+#include "Func.h"
+#include "main.h"
+
+/* これは必須 */
+SchedDefineTask(Hello);
+
+
+
+static int
+run(SchedTask *smanager, void *rbuf, void *wbuf)
+{
+    int task_id = smanager->get_param(0);
+    QueuePtr q = (QueuePtr) smanager->get_param(1);
+
+    smanager->printf("[%d] Hello, World!!\n", task_id);
+
+    for(int i=0;i<100;i++) {
+	TaskQueueInfo *i0 = q->q[i%MAX_QUEUE];
+	TaskQueueInfo *i1 = q->q[(i+1)%MAX_QUEUE];
+	TaskQueue *q0;
+	TaskQueue *q1;
+
+	switch(q->m->get_random() % 4) {
+	case 0:
+	    q0 = i0->create(0);
+	    q1 = i1->create(0);
+	    i1->addLast(q0);
+	    i0->addLast(q1);
+	    break;
+	case 1:
+	    if (TaskQueue *p = i0->poll()) {
+		i1->addLast(p);
+	    }
+	    break;
+	case 2:
+	    if (TaskQueue *p = i1->poll()) {
+		i0->addLast(p);
+	    }
+	    break;
+	case 3:
+	    if (TaskQueue *p = i0->poll()) {
+		i0->free_(p);
+	    }
+	    if (TaskQueue *p = i1->poll()) {
+		i1->free_(p);
+	    }
+	    break;
+	}
+    }
+
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/ppe/Hello.h	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,7 @@
+#ifndef INCLUDED_TASK_HELLO
+#define INCLUDED_TASK_HELLO
+
+#include "SchedTask.h"
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/ppe/task_init.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,17 @@
+#include "Func.h"
+#include "Scheduler.h"
+
+/* 必ずこの位置に書いて */
+SchedExternTask(Hello);
+
+/**
+ * この関数は ../spe/spe-main と違って
+ * 自分で呼び出せばいい関数なので
+ * 好きな関数名でおk (SchedRegisterTask は必須)
+ */
+
+void
+task_init()
+{
+  SchedRegisterTask(HELLO_TASK, Hello);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/spe/Hello.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include "Hello.h"
+#include "Func.h"
+#include "main.h"
+
+/* これは必須 */
+SchedDefineTask(Hello);
+
+static int
+run(SchedTask *smanager, void *rbuf, void *wbuf)
+{
+    int task_id = smanager->get_param(0);
+
+    smanager->printf("[%d] Hello, World!!\n", task_id);
+
+#if 0
+we don't have TaskQueue in spu
+    QueuePtr q = (QueuePtr )smanager->global_get(0);
+
+    for(int i=0;i<100;i++) {
+        TaskQueueInfo *i0 = q->q[i%MAX_QUEUE];
+        TaskQueueInfo *i1 = q->q[(i+1)%MAX_QUEUE];
+        TaskQueue *q0;
+        TaskQueue *q1;
+
+        // switch(smanager->get_random() % 4) {
+        switch(q->j++ % 4 ) {
+        case 0:
+            q0 = i0->create(0);
+            q1 = i1->create(0);
+            i1->addLast(q0);
+            i0->addLast(q1);
+            break;
+        case 1:
+            if (TaskQueue *p = i0->poll()) {
+                i1->addLast(p);
+            }
+            break;
+        case 2:
+            if (TaskQueue *p = i1->poll()) {
+                i0->addLast(p);
+            }
+            break;
+        case 3:
+            if (TaskQueue *p = i0->poll()) {
+                i0->free_(p);
+            }
+            if (TaskQueue *p = i1->poll()) {
+                i1->free_(p);
+            }
+            break;
+        }
+    }
+#endif
+
+
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/spe/Hello.h	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,9 @@
+#ifndef INCLUDED_TASK_HELLO
+#define INCLUDED_TASK_HELLO
+
+#ifndef INCLUDED_SCHED_TASK
+#  include "SchedTask.h"
+#endif
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/spe/Makefile	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,26 @@
+include ../Makefile.def
+
+TARGET = ../spe-main
+
+SRCS_TMP = $(wildcard *.cc)
+SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
+OBJS = $(SRCS:.cc=.o)
+
+CC      = spu-g++
+CFLAGS  = -O9 -g -Wall -fno-exceptions -fno-rtti#-DDEBUG
+INCLUDE = -I../${CERIUM}/include/TaskManager -I. -I..
+LIBS = -L../${CERIUM}/TaskManager -lspemanager  -Wl,--gc-sections 
+
+.SUFFIXES: .cc .o
+
+.cc.o:
+	$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+all: $(TARGET)
+
+$(TARGET): $(OBJS)
+	$(CC) -o $@ $(OBJS) $(TASK_OBJS) $(LIBS)
+
+clean:
+	rm -f $(TARGET) $(OBJS)
+	rm -f *~ \#*
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/task_queue/spe/spe-main.cc	Mon Oct 12 11:27:13 2009 +0900
@@ -0,0 +1,29 @@
+#include "Func.h"
+#include "Scheduler.h"
+#include "main.h"
+
+SchedExternTask(Hello);
+
+/**
+ * この関数は SpeScheduler から呼ばれるので
+ * 必ずこの関数名でお願いします。
+ */
+void
+task_init(Scheduler *s)
+{
+    SchedRegisterTask(HELLO_TASK, Hello);
+
+    QueuePtr q = (QueuePtr) s->allocate(sizeof(Queues));
+    
+    s->global_set(0, (void *)q);
+
+    q->i = 0;
+    q->j = 0;
+
+#if 0
+    for (int i = 0; i < MAX_QUEUE; i++) {
+        q->q[i] = new TaskQueueInfo() ;
+    }
+#endif
+
+}