changeset 42:aa11038dbdc1

*** empty log message ***
author gongo
date Thu, 14 Feb 2008 18:27:37 +0900
parents 68fb5bfee6b7
children db136fb5c21d
files TaskManager/Fifo/FifoTaskManagerImpl.cc TaskManager/Makefile TaskManager/Makefile.def TaskManager/Makefile.fifo TaskManager/Test/simple_render/Makefile TaskManager/Test/simple_render/main.cpp TaskManager/Test/simple_render/viewer.cpp TaskManager/kernel/ppe/TaskManagerImpl.cc TaskManager/kernel/schedule/MainScheduler.cc TaskManager/kernel/schedule/SchedExit.cc TaskManager/kernel/schedule/SchedMail.cc TaskManager/kernel/schedule/SchedNop.cc TaskManager/kernel/schedule/SchedNop2Ready.cc TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTaskList.cc TaskManager/kernel/schedule/Scheduler.cc include/TaskManager/DmaManager.h include/TaskManager/FifoTaskManagerImpl.h include/TaskManager/MainScheduler.h include/TaskManager/SchedExit.h include/TaskManager/SchedMail.h include/TaskManager/SchedNop.h include/TaskManager/SchedNop2Ready.h include/TaskManager/SchedTask.h include/TaskManager/SchedTaskBase.h include/TaskManager/SchedTaskList.h include/TaskManager/Scheduler.h include/TaskManager/TaskInfo.h include/TaskManager/TaskManagerImpl.h include/TaskManager/error.h include/TaskManager/ppe_spe.h
diffstat 31 files changed, 919 insertions(+), 136 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc	Wed Feb 13 23:49:08 2008 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -13,49 +13,10 @@
 void
 FifoTaskManagerImpl::init(void)
 {
+    TaskManagerImpl::init();
+
     taskInfo = new FifoTaskInfo();
     taskInfo->init();
-
-    mailManager = new MailManager();
-    mailManager->init_pool_mailQueue(20);
-}
-
-TaskListPtr
-FifoTaskManagerImpl::set_task(void)
-{
-    // ここ...直すかな
-    TaskListPtr list;
-    TaskQueuePtr queue;
-    TaskQueuePtr d;
-    HTaskPtr htask;
-    TaskPtr task;
-
-    queue = taskInfo->activeTaskQueue;
-    if (queue == NULL) {
-	return NULL;
-    }
-
-    taskInfo->clear_taskList();
- 
-    while (queue) {
-	list = taskInfo->get_available_taskList();
-	htask = queue->task;
-	d = queue;
-	queue = queue->next;
-
-	task = &list->tasks[list->length++];
-	task->command  = htask->command;
-	task->in_addr  = htask->in_addr;
-	task->out_addr = htask->out_addr;
-	task->in_size  = htask->in_size;
-	task->self = htask;
-
-	taskInfo->free_taskQueue(d);
-    }	
-
-    taskInfo->activeTaskQueue = NULL;
-
-    return list;
 }
 
 void
@@ -65,78 +26,6 @@
     //run();
 }
 
-// ../spe/main.cpp
-extern MailQueuePtr spe_main(MailManager*, MailQueuePtr);
-
-/**
- * spe 側は MY_SPE_COMMAND_EXIT を受け取るまでは別スレッドで動き続ける。
- * fifo version では sequential に動かすため、
- * mail list の最後に番兵として MY_SPE_COMMAND_EXIT のメールを入れる。
- * これで、fifo での spe 側は、mail で受け取った task_list を処理した後
- * EXIT を受け取って終了する・・・といいな
- */
-void
-FifoTaskManagerImpl::run(void)
-{
-    TaskListPtr list;
-    MailQueuePtr mail_list = NULL;
-    MailQueuePtr list_mail = NULL; // task list
-    MailQueuePtr sentinel = NULL;  // 番兵
-
-    // 暫定
-    list = set_task();
-
-    list_mail =	mailManager->create_mail((unsigned int)list);
-    mail_list = append_mailQueue(mail_list, list_mail);
-	
-    do {
-	sentinel  = mailManager->create_mail(MY_SPE_COMMAND_EXIT);
-	mail_list = append_mailQueue(mail_list, sentinel);
-
-	// 返って来た mail_list には、spe からの mail がある
-	mail_list = spe_main(mailManager, mail_list);
-	mail_list = mail_check(mail_list);
-    } while (mail_list);
-}
-
-MailQueuePtr
-FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list)
-{
-    MailQueuePtr q = mail_list;
-    MailQueuePtr d;
-    MailQueuePtr ret = NULL;
-    unsigned int data;
-    TaskListPtr next_list;
-
-    while (q) {
-	data = q->data;
-
-	if (data == MY_SPE_STATUS_READY) {
-#ifdef _PPE_DEBUG
-	    printf("[FIFO] finish\n");
-#endif
-	    next_list = set_task();
-	    if (next_list != NULL) {
-		d = mailManager->create_mail((unsigned int)next_list);
-		ret = append_mailQueue(ret, d);
-	    }
-	} else {
-#ifdef _PPE_DEBUG
-	    printf("[PPE] recv from : 0x%x\n", data);
-#endif
-	    taskInfo->check_task_finish((HTaskPtr)data);
-	}
-
-	d = q;
-	q = q->next;
-
-	mailManager->free_mailQueue(d);
-    }
-
-    return ret;
-}
-
-
 TaskManagerImpl*
 create_impl(int num)
 {
--- a/TaskManager/Makefile	Wed Feb 13 23:49:08 2008 +0900
+++ b/TaskManager/Makefile	Thu Feb 14 18:27:37 2008 +0900
@@ -24,7 +24,7 @@
 	cd $(KERN_SPE_DIR); rm -f *~ \#*
 	cd $(IMPL_FIFO_DIR); rm -f *~ \#*
 	cd $(IMPL_CELL_DIR); rm -f *~ \#*
-	rm -f $(KERN_PPE_OBJS) $(KERN_SPE_OBJS)
+	rm -f $(KERN_PPE_OBJS) $(KERN_SPE_OBJS) $(KERN_SCHED_OBJS)
 	rm -f $(IMPL_FIFO_OBJS) $(IMPL_CELL_OBJS)
 
 tags:
--- a/TaskManager/Makefile.def	Wed Feb 13 23:49:08 2008 +0900
+++ b/TaskManager/Makefile.def	Thu Feb 14 18:27:37 2008 +0900
@@ -7,6 +7,10 @@
 KERN_PPE_SRCS = $(wildcard $(KERN_PPE_DIR)/*.cpp)
 KERN_PPE_OBJS = $(KERN_PPE_SRCS:.cpp=.o)
 
+KERN_SCHED_DIR  = $(KERN_DIR)/schedule
+KERN_SCHED_SRCS = $(wildcard $(KERN_SCHED_DIR)/*.cpp)
+KERN_SCHED_OBJS = $(KERN_SCHED_SRCS:.cpp=.o)
+
 KERN_SPE_DIR  = $(KERN_DIR)/spe
 KERN_SPE_SRCS = $(wildcard $(KERN_SPE_DIR)/*.cpp)
 KERN_SPE_OBJS = $(KERN_SPE_SRCS:.cpp=.o)
@@ -20,7 +24,7 @@
 IMPL_CELL_OBJS = $(IMPL_CELL_SRCS:.cpp=.o)
 
 CC     = g++ 
-CFLAGS = -O9 -Wall -g -D_PPE_DEBUG# -DDEBUG
+CFLAGS = -Wall -g -D_PPE_DEBUG -DDEBUG
 LIBS   = 
 
 INCLUDE = -I../include/TaskManager
\ No newline at end of file
--- a/TaskManager/Makefile.fifo	Wed Feb 13 23:49:08 2008 +0900
+++ b/TaskManager/Makefile.fifo	Thu Feb 14 18:27:37 2008 +0900
@@ -8,5 +8,8 @@
 all: default
 default: $(TARGET)
 
-$(TARGET): $(KERN_PPE_OBJS) $(KERN_SPE_OBJS) $(IMPL_FIFO_OBJS)
-	ar crus $@ $(KERN_PPE_OBJS) $(KERN_SPE_OBJS) $(IMPL_FIFO_OBJS)
+ALL_OBJS = $(KERN_PPE_OBJS) $(KERN_SCHED_OBJS) $(IMPL_FIFO_OBJS)
+
+#$(TARGET): $(KERN_PPE_OBJS) $(KERN_SPE_OBJS) $(IMPL_FIFO_OBJS)
+$(TARGET): $(ALL_OBJS)
+	ar crus $@ $(ALL_OBJS)
--- a/TaskManager/Test/simple_render/Makefile	Wed Feb 13 23:49:08 2008 +0900
+++ b/TaskManager/Test/simple_render/Makefile	Thu Feb 14 18:27:37 2008 +0900
@@ -8,7 +8,7 @@
 TASK_OBJS = $(TASK_SRCS:.cpp=.o)
 
 CC      = g++
-CFLAGS  = -O9 -g -Wall
+CFLAGS  = -g -Wall
 INCLUDE = -I../../../include/TaskManager -I.
 
 EXTRA_CFLAGS = `sdl-config --cflags` `xml2-config --cflags`\
--- a/TaskManager/Test/simple_render/main.cpp	Wed Feb 13 23:49:08 2008 +0900
+++ b/TaskManager/Test/simple_render/main.cpp	Thu Feb 14 18:27:37 2008 +0900
@@ -12,6 +12,8 @@
 int run(void*, void*);
 int finish(void*, void*);
 
+extern int run_init();
+
 TaskManager *manager;
 Viewer *screen;
 
--- a/TaskManager/Test/simple_render/viewer.cpp	Wed Feb 13 23:49:08 2008 +0900
+++ b/TaskManager/Test/simple_render/viewer.cpp	Thu Feb 14 18:27:37 2008 +0900
@@ -316,6 +316,122 @@
 }
 
 
+struct run_arg_t {
+    int start_time;
+    int this_time;
+    int frames;
+    SDL_Surface *bitmap;
+    SDL_PixelFormat *pf;
+    Uint32 background;
+    Polygon *p;
+    SceneGraphPack *sgp;
+    PolygonPack *pp;    
+};
+
+#if 0
+void
+Viewer::run_init()
+{
+    struct run_arg_t *arg = new run_arg_t;
+    HTaskPtr task;
+    int fd;
+
+    arg->start_time = get_ticks();
+    arg->pf         = screen->format;
+    arg->background = SDL_MapRGB(screen->format, 0x00, 0x00, 0x00);
+    arg->p          = new Polygon;
+    arg->p->set_data("cube.xml");
+    arg->p->viewer  = this;
+    arg->sgp        = new SceneGraphPack;
+    create_sgp(arg->sgp, arg->p);
+    arg->pp         = new PolygonPack;
+
+    pixels = new Uint32[width*height];
+    
+    graph_line();
+
+    arg->bitmap = SDL_CreateRGBSurfaceFrom((void *)pixels, width, height, 32,
+				      width*4, redMask, greenMask,
+				      blueMask, alphaMask);
+
+    fd = manager->open("ViewerRunLoop");
+    task = manager->create_task(fd, sizeof(struct run_arg_t),
+				(unsigned int)arg, 0, NULL);      
+    manager->spawn_task(task_create_pp);
+    //manager->run();
+}
+
+void
+Viewer::run_loop(struct run_arg_t *arg)
+{
+    HTaskPtr task_update_sgp = NULL;
+    HTaskPtr task_create_pp = NULL;
+    HTaskPtr task_finish = NULL;
+    int fd_update_sgp;
+    int fd_create_pp;
+    int fd_finish;
+
+    if (quit_check()) {
+	arg->this_time = get_ticks();
+	fd_finish = manager->open("ViewerRunFinish");
+	task_finish = manager->create(fd_finish, sizeof(struct run_arg_t),
+				      (unsigned int)arg, 0, NULL);
+	manager->spawn_task(task_finish);
+	return;
+    }
+
+    clean_pixels();
+
+    this->zRow_init();
+    graph_line();
+
+    fd_update_sgp = manager->open("UpdateSGP");
+    fd_create_pp  = manager->open("CreatePP");
+    task_update_sgp =
+	manager->create_task(fd_update_sgp,
+			     sizeof(SceneGraphPack),
+			     (unsigned int)arg->sgp,
+			     (unsigned int)arg->sgp,
+			     NULL);      
+    task_create_pp =
+	manager->create_task(fd_create_pp,
+			     sizeof(SceneGraphPack),
+			     (unsigned int)arg->sgp,
+			     (unsigned int)arg->pp,
+			     NULL);
+
+    manager->spawn_task(task_update_sgp);
+    manager->spawn_task(task_create_pp);
+    manager->run();
+
+    arg->p->draw(pp);    // test draw of PolygonPack
+	
+    SDL_BlitSurface(arg->bitmap, NULL, screen, NULL);
+    SDL_UpdateRect(screen, 0, 0, 0, 0);
+
+    //swap_buffers();
+    arg->frames++;
+}
+
+void
+Viewer::run_finish(struct run_arg_t *arg)
+{
+    if (arg->this_time != arg->start_time) {
+	cout<< ((float)arg->frames/(this_time-start_time))*1000.0 << " FPS\n";
+    }
+
+    SDL_FreeSurface(arg->bitmap);
+    delete [] pixels;
+    arg->p->delete_data();
+    delete arg->p;
+    delete arg->sgp;
+    delete arg->pp;
+    quit();
+
+    delete arg;
+}
+#endif
+
 void Viewer::run()
 {
     int frames = 0;
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Wed Feb 13 23:49:08 2008 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -1,6 +1,8 @@
 #include <stdio.h>
 #include "TaskManagerImpl.h"
 
+#include "ppe_spe.h"
+
 void
 noaction(void)
 {
@@ -11,6 +13,17 @@
     machineNum = num;
 }
 
+void
+TaskManagerImpl::init(void)
+{
+    mailManager = new MailManager();
+    mailManager->init_pool_mailQueue(20);
+
+    scheduler = new MainScheduler();
+    scheduler->init();
+    scheduler->set_mailManager(mailManager);
+}
+
 HTaskPtr
 TaskManagerImpl::create_task(int cmd, int size,
 			 unsigned long long in_addr, 
@@ -55,3 +68,112 @@
 	taskInfo->append_waitTask(task);	
     }
 }
+
+TaskListPtr
+TaskManagerImpl::set_task(void)
+{
+    // ここ...直すかな
+    TaskListPtr list;
+    TaskQueuePtr queue;
+    TaskQueuePtr d;
+    HTaskPtr htask;
+    TaskPtr task;
+
+    queue = taskInfo->activeTaskQueue;
+    if (queue == NULL) {
+	return NULL;
+    }
+
+    taskInfo->clear_taskList();
+ 
+    while (queue) {
+	list = taskInfo->get_available_taskList();
+	htask = queue->task;
+	d = queue;
+	queue = queue->next;
+
+	task = &list->tasks[list->length++];
+	task->command  = htask->command;
+	task->in_addr  = htask->in_addr;
+	task->out_addr = htask->out_addr;
+	task->in_size  = htask->in_size;
+	task->self = htask;
+
+	taskInfo->free_taskQueue(d);
+    }	
+
+    taskInfo->activeTaskQueue = NULL;
+
+    return list;
+}
+
+
+// ../spe/main.cpp
+extern MailQueuePtr spe_main(MailManager*, MailQueuePtr);
+
+void
+TaskManagerImpl::run(void)
+{
+    TaskListPtr list;
+    MailQueuePtr list_mail; // task list
+    MailQueuePtr sentinel;  // 番兵
+    MailQueuePtr in_mail_list = NULL;
+    MailQueuePtr out_mail_list = NULL;
+
+    // 暫定
+    list = set_task();
+
+    list_mail =	mailManager->create_mail((unsigned int)list);
+    in_mail_list = append_mailQueue(in_mail_list, list_mail);
+	
+    do {
+	sentinel  = mailManager->create_mail(MY_SPE_COMMAND_EXIT);
+	in_mail_list = append_mailQueue(in_mail_list, sentinel);
+
+	// 返って来た mail_list には、spe からの mail がある
+	scheduler->send_mailList(in_mail_list);
+	scheduler->run();
+	out_mail_list = scheduler->recv_mailList();
+	in_mail_list = mail_check(out_mail_list);
+    } while (in_mail_list);
+}
+
+/**
+ * PPE Scheduler からのメールをチェックする
+ */
+MailQueuePtr
+TaskManagerImpl::mail_check(MailQueuePtr mail_list)
+{
+    MailQueuePtr q = mail_list;
+    MailQueuePtr d;
+    MailQueuePtr ret = NULL;
+    unsigned int data;
+    TaskListPtr next_list;
+
+    while (q) {
+	data = q->data;
+
+	if (data == MY_SPE_STATUS_READY) {
+#ifdef _PPE_DEBUG
+	    printf("[FIFO] finish\n");
+#endif
+	    next_list = set_task();
+	    if (next_list != NULL) {
+		d = mailManager->create_mail((unsigned int)next_list);
+		ret = append_mailQueue(ret, d);
+	    }
+	} else {
+#ifdef _PPE_DEBUG
+	    printf("[PPE] recv from : 0x%x\n", data);
+#endif
+	    taskInfo->check_task_finish((HTaskPtr)data);
+	}
+
+	d = q;
+	q = q->next;
+
+	mailManager->free_mailQueue(d);
+    }
+
+    return ret;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/MainScheduler.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,47 @@
+#include <stdlib.h>
+#include "MainScheduler.h"
+#include "FifoDmaManager.h"
+#include "error.h"
+
+void
+MainScheduler::init_impl(void)
+{
+    connector = new FifoDmaManager();
+
+    for (int i = 0; i < 2; i++) {
+	listBuf[i] = new TaskList;
+	readBuf[i] = malloc(16*1024);
+	writeBuf[i] = malloc(16*1024);
+    }
+}
+
+void
+MainScheduler::set_mailManager(MailManager *m)
+{
+    ((FifoDmaManager*)connector)->mailManager = m;
+}
+
+
+void
+MainScheduler::send_mailList(MailQueuePtr mail_list)
+{
+    ((FifoDmaManager*)connector)->mail_recvQueue = mail_list;
+    ((FifoDmaManager*)connector)->mail_sendQueue = NULL;
+}
+
+MailQueuePtr
+MainScheduler::recv_mailList(void)
+{
+    return ((FifoDmaManager*)connector)->mail_sendQueue;
+}
+
+void
+MainScheduler::finish(void)
+{
+    delete listBuf[0];
+    delete listBuf[1];
+    free(readBuf[0]);
+    free(readBuf[1]);
+    free(writeBuf[0]);
+    free(writeBuf[1]);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/SchedExit.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include "SchedExit.h"
+#include "error.h"
+
+SchedTaskBase*
+SchedExit::next(Scheduler *m, SchedTaskBase *p)
+{
+    delete p;
+
+    __debug("SchedExit::next()\n");
+
+    return NULL;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/SchedMail.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,35 @@
+#include "SchedMail.h"
+#include "SchedTaskList.h"
+#include "SchedExit.h"
+#include "error.h"
+
+SchedMail::SchedMail(DmaManager *cn)
+{
+    connector = cn;
+}
+
+void
+SchedMail::read(void)
+{
+
+    __debug("[SchedMail:%s]\n", __FUNCTION__);
+    
+    params_addr = connector->mail_read();
+    
+    __debug("  params_addr = 0x%x\n", params_addr);
+}
+
+SchedTaskBase*
+SchedMail::next(Scheduler *m, SchedTaskBase *p)
+{
+    delete p;
+
+    __debug("[SchedMail:%s]\n", __FUNCTION__);
+
+    // if 文なくすには・・・関数ポインタ?
+    if ((int)params_addr == MY_SPE_COMMAND_EXIT) {
+	return new SchedExit();
+    } else {
+	return new SchedTaskList(params_addr, m->get_curListBuf(), connector);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/SchedNop.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,14 @@
+#include <stdio.h>
+#include "SchedNop.h"
+#include "SchedMail.h"
+#include "error.h"
+
+SchedTaskBase*
+SchedNop::next(Scheduler *m, SchedTaskBase *p)
+{
+    __debug("SchedNop::next()");
+    
+    delete p;
+
+    return new SchedMail(m->connector);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/SchedNop2Ready.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include "SchedNop2Ready.h"
+#include "SchedMail.h"
+#include "error.h"
+
+SchedNop2Ready::SchedNop2Ready(DmaManager *cn)
+{
+    connector = cn;
+}
+
+void
+SchedNop2Ready::exec(void)
+{
+    __debug("[SchedNop2Ready:%s]\n", __FUNCTION__);
+
+    connector->mail_write(MY_SPE_STATUS_READY);
+}
+
+SchedTaskBase*
+SchedNop2Ready::next(Scheduler *m, SchedTaskBase *p)
+{
+    __debug("[SchedNop2Ready:%s]\n", __FUNCTION__);
+    
+    delete p;
+
+    return new SchedMail(connector);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/SchedTask.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,101 @@
+#include "SchedTask.h"
+#include "SchedTaskList.h"
+#include "SchedNop2Ready.h"
+#include "DmaManager.h"
+#include "error.h"
+#include "TaskManager.h"
+#include "SymTable.h"
+
+SymTable *TaskManager::symtb;
+
+SchedTask::SchedTask(TaskListPtr _list, TaskPtr _task, void *rbuf, void *wbuf,
+		 DmaManager* cn)
+{
+    list = _list;
+    task = _task;
+    readbuf = rbuf;
+    writebuf = wbuf;
+    connector = cn;
+}
+
+void
+SchedTask::read(void)
+{    
+    __debug("[SchedTask:%s]\n", __FUNCTION__);
+
+    //task = &list->tasks[--list->length];
+    connector->dma_load(readbuf, task->in_addr, task->in_size, DMA_READ);
+}
+
+void
+SchedTask::exec(void)
+{
+    __debug("[SchedTask:%s]\n", __FUNCTION__);
+
+    connector->dma_wait(DMA_READ);
+
+    __debug("  task->command  = %d\n", task->command);
+    __debug("  task->in_size  = %d\n", task->in_size);
+    __debug("  task->in_addr  = 0x%x\n", task->in_addr);
+    __debug("  task->out_addr = 0x%x\n", task->out_addr);
+    __debug("  list->next     = 0x%x\n", (unsigned int)list->next);
+    __debug("  list->length   = 0x%x\n", (unsigned int)list->length);
+
+    // obsolute
+    //   task->in_size = func_list[task->command](writebuf, readbuf);
+
+    // ごちゃごちゃしてるな
+    // 最初から void* じゃなくて 関数ポインタ としていれるべきか?
+    int (*func)(void*, void*)
+	= (int (*)(void*,void*))TaskManager::get_address(task->command);
+    task->in_size = func(writebuf, readbuf);
+    connector->dma_store(writebuf, task->out_addr, task->in_size, DMA_WRITE);
+}
+
+void
+SchedTask::write(void)
+{
+    __debug("[SchedTask:%s]\n", __FUNCTION__);
+
+    connector->dma_wait(DMA_WRITE);
+    connector->mail_write((unsigned int)task->self);
+}
+
+SchedTaskBase*
+SchedTask::next(Scheduler *m, SchedTaskBase *p)
+{
+    __debug("[SchedTask:%s]\n", __FUNCTION__);
+
+    delete p;
+ 
+    // ここ直さねば。どうやって if 文消そう?
+    // オブジェクト増やせばいいのかな
+    if (list->length == 0) {
+	if (list->next == 0) {
+	    return new SchedNop2Ready(connector);
+	} else {
+	    return new SchedTaskList((unsigned int)list->next,
+				   m->get_curListBuf(), connector);
+	}
+    } else {
+	//return new SchedTask(list, m->get_curReadBuf(),
+	//m->get_curWriteBuf(), connector);
+
+	// 本当は、ここで task->command に対応する、
+	// SchedTask を継承する class を作ればいい。。。はず
+	return new SchedTask(list, &list->tasks[--list->length],
+			     m->get_curReadBuf(), m->get_curWriteBuf(),
+			     connector);
+    }
+}
+
+#if 0
+SchedTask
+createSchedTask(TaskListPtr list, void *rbuf, void *wbuf, DmaManager *cn)
+{
+    TaskPtr task;
+
+    task = &list->tasks[--list->length];
+    
+}
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/SchedTaskList.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,40 @@
+#include "SchedTaskList.h"
+#include "SchedTask.h"
+#include "SchedNop2Ready.h"
+#include "DmaManager.h"
+#include "error.h"
+
+SchedTaskList::SchedTaskList(unsigned int addr, TaskListPtr listbuf, DmaManager* c)
+{
+    params_addr = addr;
+    list = listbuf;
+    connector = c;
+}
+
+void
+SchedTaskList::read(void)
+{
+    __debug("[SchedTaskList:%s]\n", __FUNCTION__);
+
+    connector->dma_load(list, params_addr, sizeof(TaskList), DMA_READ);
+    connector->dma_wait(DMA_READ);
+}
+
+SchedTaskBase*
+SchedTaskList::next(Scheduler *m, SchedTaskBase *p)
+{
+    __debug("[SchedTaskList:%s]\n", __FUNCTION__);
+
+    delete p;
+
+    if (list->length < 1) {
+	return new SchedNop2Ready(connector);
+    } else {
+	// 本当は、ここで task->command に対応する、
+	// SchedTask を継承する class を作ればいい。。。はず
+	return new SchedTask(list, &list->tasks[--list->length],
+			   m->get_curReadBuf(),
+			   m->get_curWriteBuf(),
+			   connector);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,61 @@
+#include "Scheduler.h"
+#include "SchedNop.h"
+#include "error.h"
+
+void
+Scheduler::init(void)
+{
+    init_impl();
+    
+    listBufFlg = 0;
+    readBufFlg = 0;
+    writeBufFlg = 0;
+}
+
+void
+Scheduler::run(void)
+{
+    SchedTaskBase* taskTmp;
+    task1 = new SchedNop();
+    task2 = new SchedNop();
+    task3 = new SchedNop();
+
+    // main loop
+    do {
+	__debug("----------\n");
+	task3->write();
+	task2->exec();
+	task1->read();
+
+	taskTmp = task3;
+	task3 = task2;
+	task2 = task1;
+	task1 = task1->next(this, taskTmp);
+    } while (task1);
+
+    delete task3;
+    delete task2;
+}
+
+TaskListPtr
+Scheduler::get_curListBuf(void)
+{
+    listBufFlg ^= 1;
+    return listBuf[listBufFlg];
+}
+
+
+void *
+Scheduler::get_curWriteBuf(void)
+{
+    writeBufFlg ^= 1;
+    return writeBuf[writeBufFlg];
+}
+
+
+void*
+Scheduler::get_curReadBuf(void)
+{
+    readBufFlg ^= 1;
+    return readBuf[readBufFlg];
+}
--- a/include/TaskManager/DmaManager.h	Wed Feb 13 23:49:08 2008 +0900
+++ b/include/TaskManager/DmaManager.h	Thu Feb 14 18:27:37 2008 +0900
@@ -6,7 +6,9 @@
     DMA_WRITE
 };
 
-#include "ppe_spe.h"
+#ifndef INCLUDED_TYPES
+#  include "ppe_spe.h"
+#endif
 
 class DmaManager {
 public:
--- a/include/TaskManager/FifoTaskManagerImpl.h	Wed Feb 13 23:49:08 2008 +0900
+++ b/include/TaskManager/FifoTaskManagerImpl.h	Thu Feb 14 18:27:37 2008 +0900
@@ -9,10 +9,6 @@
 #  include "TaskManagerImpl.h"
 #endif
 
-#ifndef INCLUDED_MAIL_MANAGER
-#  include "MailManager.h"
-#endif
-
 class FifoTaskManagerImpl : public TaskManagerImpl {
 public:
     /* constructor */
@@ -23,14 +19,6 @@
     void run(void);
 
     void spawn_task(HTaskPtr);
-    TaskListPtr set_task(void);
-
-private:
-    /* variables */
-    MailManager *mailManager;
-
-    /* functions */
-    MailQueuePtr mail_check(MailQueuePtr mail_list);
 };
 
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/MainScheduler.h	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,21 @@
+#ifndef INCLUDED_MAIN_SCHEDULER
+#define INCLUDED_MAIN_SCHEDULER
+
+#ifndef INCLUDED_SCHEDULER
+#  include "Scheduler.h"
+#endif
+
+#ifndef INCLUDED_MAIL_MANAGER
+#  include "MailManager.h"
+#endif
+
+class MainScheduler : public Scheduler {
+public:
+    void init_impl(void);
+    void finish(void);
+    void set_mailManager(MailManager *);
+    void send_mailList(MailQueuePtr mail_list);
+    MailQueuePtr recv_mailList(void);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedExit.h	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,23 @@
+#ifndef INCLUDED_SCHED_EXIT
+#define INCLUDED_SCHED_EXIT
+
+#ifndef INCLUDED_SCHEDULER
+#  include "Scheduler.h"
+#endif
+
+#ifndef INCLUDED_SCHED_TASK_BASE
+#  include "SchedTaskBase.h"
+#endif
+
+class SchedExit : public SchedTaskBase {
+public:
+    /* constructor */
+    SchedExit(void) {}
+
+    /* variables */
+
+    /* functions */
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedMail.h	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,33 @@
+#ifndef INCLUDED_SCHED_MAIL
+#define INCLUDED_SCHED_MAIL
+
+#ifndef INCLUDED_SCHEDULER
+#  include "Scheduler.h"
+#endif
+
+#ifndef INCLUDED_SCHED_TASK_BASE
+#  include "SchedTaskBase.h"
+#endif
+
+#include "error.h"
+
+class SchedMail : public SchedTaskBase{
+public:
+    /* constructor */
+    SchedMail(DmaManager *);
+
+    /* variables */
+    unsigned int params_addr;
+    DmaManager* connector;    
+
+    /* functions */
+    void read(void);
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+
+#if DEBUG
+    void exec(void)  { __debug("[SchedMail:%s]\n", __FUNCTION__); }
+    void write(void) { __debug("[SchedMail:%s]\n", __FUNCTION__); }
+#endif
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedNop.h	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,26 @@
+#ifndef INCLUDED_SCHED_NOP
+#define INCLUDED_SCHED_NOP
+
+#ifndef INCLUDED_SCHEDULER
+#  include "Scheduler.h"
+#endif
+
+#ifndef INCLUDED_SCHED_TASK_BASE
+#  include "SchedTaskBase.h"
+#endif
+
+#include "error.h"
+
+class SchedNop : public SchedTaskBase {
+public:
+    /* functions */
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+
+#if DEBUG
+    void read(void)  { __debug("[SchedNop:%s]\n", __FUNCTION__); }
+    void exec(void)  { __debug("[SchedNop:%s]\n", __FUNCTION__); }
+    void write(void) { __debug("[SchedNop:%s]\n", __FUNCTION__); }
+#endif
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedNop2Ready.h	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,36 @@
+#ifndef INCLUDED_SCHED_NOP2READY
+#define INCLUDED_SCHED_NOP2READY
+
+#ifndef INCLUDED_SCHEDULER
+#  include "Scheduler.h"
+#endif
+
+#ifndef INCLUDED_SCHED_TASK_BASE
+#  include "SchedTaskBase.h"
+#endif
+
+#ifndef INCLUDED_SCHED_NOP
+#  include "SchedNop.h"
+#endif
+
+#include "error.h"
+
+class SchedNop2Ready : public SchedNop {
+public:
+    /* constructor */
+    SchedNop2Ready(DmaManager*);
+
+    /* variables */
+    DmaManager* connector;    
+
+    /* functions */
+    void exec(void);
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+
+#if DEBUG
+    void read(void)  { __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); }
+    void write(void) { __debug("[SchedNop2Ready:%s]\n", __FUNCTION__); }
+#endif
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedTask.h	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,41 @@
+#ifndef INCLUDED_SCHED_TASK
+#define INCLUDED_SCHED_TASK
+
+#ifndef INCLUDED_SCHEDULER
+#  include "Scheduler.h"
+#endif
+
+#ifndef INCLUDED_SCHED_TASK_BASE
+#  include "SchedTaskBase.h"
+#endif
+
+class SchedTask : public SchedTaskBase {
+public:
+    /* constructor */
+    SchedTask(TaskListPtr, TaskPtr, void*, void*, DmaManager*);
+
+    /* variables */
+    TaskListPtr list;
+    TaskPtr task;
+    void *readbuf;
+    void *writebuf;
+
+    DmaManager* connector;
+
+    // work area
+    //   global variable 用とか
+    //   次の task に引き渡したり
+    // size : デフォルトで 4k
+    //        ppuから教えてもらう? task に入れる
+    void (*func)(void *wbuf, void *rbuf);
+
+    /* functions */
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+
+    // override
+    void read(void);
+    void exec(void);
+    void write(void);
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedTaskBase.h	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,26 @@
+#ifndef INCLUDED_SCHED_TASK_BASE
+#define INCLUDED_SCHED_TASK_BASE
+
+#ifndef INCLUDED_SCHEDULER
+#  include "Scheduler.h"
+#endif
+
+class Scheduler;
+
+class SchedTaskBase {
+public:
+    /* constructor */
+    //SchedTaskBase(void) {}
+    virtual ~SchedTaskBase(void) {}
+
+    // noaction in default
+    virtual void load(void)  {}
+    virtual void read(void)  {}
+    virtual void exec(void)  {}
+    virtual void write(void) {}
+
+    /* functions */
+    virtual SchedTaskBase* next(Scheduler*, SchedTaskBase*) = 0;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/SchedTaskList.h	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,40 @@
+#ifndef INCLUDED_SCHED_TASKLIST
+#define INCLUDED_SCHED_TASKLIST
+
+#ifndef INCLUDED_SCHEDULER
+#  include "Scheduler.h"
+#endif
+
+#ifndef INCLUDED_SCHED_TASK_BASE
+#  include "SchedTaskBase.h"
+#endif
+
+#include "error.h"
+
+class SchedTaskList : public SchedTaskBase {
+public:
+    /* constructor */
+    SchedTaskList(unsigned int addr, TaskListPtr list, DmaManager* c);
+
+    /* variables */
+    unsigned int params_addr;
+    TaskListPtr list;
+    DmaManager* connector;
+
+    /* functions */
+    SchedTaskBase* next(Scheduler *, SchedTaskBase *);
+    
+    /* override functions */
+    void read(void);
+
+#ifdef DEBUG
+    void exec(void)  { __debug("[SchedTaskList:%s]\n", __FUNCTION__); }
+    void write(void) { __debug("[SchedTaskList:%s]\n", __FUNCTION__); }
+#endif
+
+};
+
+//extern void get_task_list();
+//extern void print_task_list();
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/TaskManager/Scheduler.h	Thu Feb 14 18:27:37 2008 +0900
@@ -0,0 +1,47 @@
+#ifndef INCLUDED_SCHEDULER
+#define INCLUDED_SCHEDULER
+
+#ifndef INCLUDED_TASK
+#  include "task.h"
+#endif
+
+#ifndef INCLUDED_DMA_MANAGER
+#  include "DmaManager.h"
+#endif
+
+#ifndef INCLUDED_SCHED_TASK_BASE
+#  include "SchedTaskBase.h"
+#endif
+
+class SchedTaskBase;
+
+class Scheduler {
+public:
+    virtual ~Scheduler(void) {}
+
+    /* variables */
+    TaskListPtr listBuf[2];
+    void *readBuf[2];
+    void *writeBuf[2];
+    int listBufFlg;
+    int readBufFlg;
+    int writeBufFlg;
+
+    DmaManager* connector;
+    
+    SchedTaskBase* task1;
+    SchedTaskBase* task2;
+    SchedTaskBase* task3;
+
+    /* functions */
+    void init(void);
+    void run(void);
+    virtual void init_impl(void) = 0;
+    virtual void finish(void) = 0;
+
+    TaskListPtr get_curListBuf(void);
+    void* get_curReadBuf(void);
+    void* get_curWriteBuf(void);
+};
+
+#endif
--- a/include/TaskManager/TaskInfo.h	Wed Feb 13 23:49:08 2008 +0900
+++ b/include/TaskManager/TaskInfo.h	Thu Feb 14 18:27:37 2008 +0900
@@ -53,8 +53,8 @@
 
     virtual void clear_taskList(void) = 0;
 
-    void append_activeTask(HTaskPtr);
-    void append_waitTask(HTaskPtr);
+    virtual void append_activeTask(HTaskPtr);
+    virtual void append_waitTask(HTaskPtr);
 
     void free_taskList(TaskListPtr q);
     void free_taskQueue(TaskQueuePtr q);
--- a/include/TaskManager/TaskManagerImpl.h	Wed Feb 13 23:49:08 2008 +0900
+++ b/include/TaskManager/TaskManagerImpl.h	Thu Feb 14 18:27:37 2008 +0900
@@ -5,6 +5,14 @@
 #  include "TaskInfo.h"
 #endif
 
+#ifndef INCLUDED_MAIL_MANAGER
+#  include "MailManager.h"
+#endif
+
+#ifndef INCLUDED_MAIN_SCHEDULER
+#  include "MainScheduler.h"
+#endif
+
 class TaskManagerImpl {
 public:
     /* constructor */
@@ -14,16 +22,20 @@
     /* variables */
     int machineNum;
     TaskInfo* taskInfo;
+    MailManager *mailManager;
+    MainScheduler *scheduler;
 
     /* functions */
-    virtual void init(void) = 0;
-    virtual void run(void) = 0;
+    virtual void init(void);
+    void run(void);
+    MailQueuePtr mail_check(MailQueuePtr mail_list);
     
     HTaskPtr create_task(int cmd, int siz,
 			 unsigned long long in_addr,
 			 unsigned long long out_addr,
 			 void (*func)(void));
     void set_task_depend(HTaskPtr master, HTaskPtr slave);
+    TaskListPtr set_task(void);
     virtual void spawn_task(HTaskPtr);
 };
 #endif
--- a/include/TaskManager/error.h	Wed Feb 13 23:49:08 2008 +0900
+++ b/include/TaskManager/error.h	Thu Feb 14 18:27:37 2008 +0900
@@ -1,4 +1,3 @@
-//extern void __debug(char *str);
 #ifdef DEBUG
 #  include <stdio.h>
 #  define __debug(...) do { \
@@ -7,3 +6,13 @@
 #else /* DEBUG */
 #  define __debug(...)
 #endif
+
+#ifdef _PPE_DEBUG
+#  include <stdio.h>
+#  define __debug_ppe(...) do { \
+	printf(__VA_ARGS__); \
+    } while (0)
+#else /* DEBUG */
+#  define __debug_ooe(...)
+#endif
+
--- a/include/TaskManager/ppe_spe.h	Wed Feb 13 23:49:08 2008 +0900
+++ b/include/TaskManager/ppe_spe.h	Thu Feb 14 18:27:37 2008 +0900
@@ -1,6 +1,9 @@
 /**
  * Alignment value and macro for DMA transfer in SPE
  */
+#ifndef INCLUDED_TYPES
+#define INCLUDED_TYPES
+
 #define SPE_ALIGNMENT 16
 #define SPE_ALIGNMENT_FULL 128
 #define SPE_ALIGN __attribute__((aligned(SPE_ALIGNMENT)))
@@ -16,3 +19,5 @@
     MY_SPE_STATUS_BUSY,
     MY_SPE_STATUS_READY
 };
+
+#endif