changeset 1072:262d9367848d draft

merge
author yutaka@localhost.localdomain
date Fri, 17 Dec 2010 00:18:36 +0900
parents 19a1769343d6 (current diff) 5fda85b39dc2 (diff)
children 6a9f02fa8e74
files Renderer/Engine/sys.cc Renderer/Engine/sys.h SceneGraph/BlenderScript/export_xml.py TaskManager/Cell/spe/MailQueue.h
diffstat 120 files changed, 2044 insertions(+), 1596 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/Application.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Application.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -3,5 +3,3 @@
 
 Application::Application(){}
 Application::~Application(){}
-
-
--- a/Renderer/Engine/Application.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Application.h	Fri Dec 17 00:18:36 2010 +0900
@@ -14,7 +14,9 @@
 public:
     Application();
     virtual ~Application();
-    
+
+    virtual bool app_loop(Viewer *viewer){ return 1; /* use all execute */ };
+    virtual HTaskPtr application_task(HTaskPtr next, Viewer* viewer){return next;};
     virtual MainLoopPtr init(Viewer *viewer, int w, int h)  = 0;
 };
 
--- a/Renderer/Engine/Button.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Button.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -25,6 +25,17 @@
 }
 
 /**
+ * ボタンの状態を初期化する
+ */
+void
+Button::reset(void)
+{
+    push = 0;
+    hold = 0;
+    release = 0;
+}
+
+/**
  * @retval 1 ボタンが押された(このフレームのみ)
  * @retval 0 押されていない
  */
--- a/Renderer/Engine/Button.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Button.h	Fri Dec 17 00:18:36 2010 +0900
@@ -11,6 +11,7 @@
 
     void push_work(void);
     void release_work(void);
+    void reset(void);
     int isPush(void);
     int isHold(void);
     int isRelease(void);
--- a/Renderer/Engine/Camera.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Camera.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 #include <math.h>
 #include "SceneGraphRoot.h"
 #include "Camera.h"
-#include "sys.h"
+#include "matrix_calc.h"
 #include "Scheduler.h"
 #include "TaskManager.h"
 
@@ -157,6 +157,7 @@
       }
     }
 
+    update(w,h); // to make matrix[]
 }
 
 Camera::~Camera(void)
--- a/Renderer/Engine/Light.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Light.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 #include <math.h>
 #include "SceneGraphRoot.h"
 #include "Light.h"
-#include "sys.h"
+#include "matrix_calc.h"
 #include "Scheduler.h"
 #include "TaskManager.h"
 
--- a/Renderer/Engine/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc) $(wildcard Application/*.cc) $(wildcard ps3fb/*.cc)
-SRCS_EXCLUDE =   # 
+SRCS_EXCLUDE =   # 除外
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/Renderer/Engine/Makefile.def	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Makefile.def	Fri Dec 17 00:18:36 2010 +0900
@@ -2,10 +2,10 @@
 
 CERIUM = ../..
 
-ABIBIT = 32 
+ABIBIT = 64 
 ABI = -m$(ABIBIT)
 CC      = g++
-OPT	= -g -O9 #-DSPE_CREATE_POLYGON_CHECK -DSPE_CREATE_POLYGON=1
+OPT	= -g # -O9 #-DSPE_CREATE_POLYGON_CHECK -DSPE_CREATE_POLYGON=1
 CFLAGS  = -Wall $(ABI) $(OPT)  #  -DDEBUG
 
 INCLUDE = -I$(CERIUM)/include/TaskManager -I.
--- a/Renderer/Engine/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc) $(wildcard Application/*.cc)
-SRCS_EXCLUDE =   # 
+SRCS_EXCLUDE =   # 除外
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/Renderer/Engine/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc) $(wildcard Application/*.cc)
-SRCS_EXCLUDE =  # 
+SRCS_EXCLUDE =  # 除外
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/Renderer/Engine/SceneGraph.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/SceneGraph.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -3,9 +3,10 @@
 #include <SDL_opengl.h>
 #include <SDL_image.h>
 #include <libxml/parser.h>
+#include <string.h>
 #include "SceneGraph.h"
 #include "xml.h"
-#include "sys.h"
+#include "matrix_calc.h"
 #include "TextureHash.h"
 #include "texture.h"
 #include "TaskManager.h"
@@ -60,24 +61,44 @@
  * @param[in] scale         テクスチャの最大縮小率 (= 2^n)
  * @return (1) のアドレス
  */
+
+
+uint32 white[256] __attribute__((aligned(16)));
+
 static uint32*
-makeTapestry(TaskManager *manager, int tex_w, int tex_h, uint32 *tex_src,
+makeTapestry(TaskManager *manager, uint32 tex_w, uint32 tex_h, uint32 *tex_src,
              int all_pixel_num, int scale_cnt)
 {
+    if (tex_w==0 && tex_h==0) {
+	// non texture case
+	uint32 pattern = SDL_BYTEORDER == SDL_LIL_ENDIAN? 0x00ffffff : 0xffffff00; /* OpenGL RGBA masks */
+	if (white[0]!=pattern)  { // dumb!
+#if 1
+            for(int i=0;i<256;i++)
+               white[i] = pattern;
+#else
+	    memset_pattern4(white,&pattern,256);
+#endif
+        }
+	return white;
+    }
 
-    int t = 0;
-    int diff = TEXTURE_SPLIT_PIXEL;
-    int p_diff = 1;
+    uint32 t = 0;
+    uint32 diff = TEXTURE_SPLIT_PIXEL;
+    uint32 p_diff = 1;
 
     uint32 *tex_dest = (uint32*)manager->allocate(sizeof(int)*all_pixel_num);
 
+    uint32 alpha =  SDL_BYTEORDER == SDL_LIL_ENDIAN? 0xff000000 : 0xff; /* OpenGL RGBA masks */
+
     while (scale_cnt) {
-        for (int y = 0; y < tex_h; y += diff) {
-            for (int x = 0; x < tex_w; x += diff) {
-                for (int j = 0; j < diff; j += p_diff) {
-                    for (int i = 0; i < diff; i += p_diff) {
-                        tex_dest[t++]
-                            = tex_src[(x+i) + tex_w*(y+j)];
+	// we should use average, except clear one
+        for (uint32 y = 0; y < align(tex_h,diff); y += diff) {
+            for (uint32 x = 0; x < align(tex_w,diff); x += diff) {
+                for (uint32 j = 0; j < diff; j += p_diff) {
+                    for (uint32 i = 0; i < diff; i += p_diff) {
+                        tex_dest[t++] = 
+			    (x+i<=tex_h && y+j<=tex_w) ? tex_src[(x+i) + tex_w*(y+j)]: alpha;
                     }
                 }
             }
@@ -207,7 +228,7 @@
 
 #endif
 
-    texture_id = -1;
+    texture_info.texture_id = -1;
     move = no_move;
     collision = no_collision;
 
@@ -483,6 +504,8 @@
                 int tex_w = texture_image->w;
                 int tex_h = texture_image->h;
                 int all_pixel_num = 0;
+		int nw = tex_w;
+		int nh = tex_h;
 
                 /**
                  * テクスチャの w or h が 8 pixel で分割できる間、
@@ -494,23 +517,28 @@
                  *     scale = 16
                  *  (128, 64) => 64,32 : 32,16: 16,8
                  *     scale = 8
+                 *  8 pixcel align してない場合は、透明に 8 pixcel に拡張する
+                 *  (200, 57) => 200,64 : 100,32 : 56,16: 32,8  (16,1 : 8,1 まで落すべき? 32byte)
+                 *     scale = 32
                  */
-                while (tex_w % TEXTURE_SPLIT_PIXEL == 0 &&
-                       tex_h % TEXTURE_SPLIT_PIXEL == 0) {
-                    all_pixel_num += tex_w*tex_h;
+
+		do {
+		    tex_w = align(tex_w,8);
+		    tex_h = align(tex_h,8);
+                    all_pixel_num += tex_w * tex_h;
                     tex_w >>= 1; /* tex_w /= 2 */
                     tex_h >>= 1;
                     scale <<= 1; /* scale *= 2 */
-                }
+                } while( tex_w >8 || tex_h > 8 );
 
-                scale >>= 1;
+                scale >>= 1;     // 必ず 1 以上になる
 
                 tapestry = makeTapestry(manager, texture_image->w, texture_image->h,
                                         (uint32*)texture_image->pixels,
                                         all_pixel_num, scale);
 
-                list[id].t_w = texture_image->w;
-                list[id].t_h = texture_image->h;
+                list[id].t_w = nw;
+                list[id].t_h = nh;
                 list[id].pixels_orig = (Uint32*)texture_image->pixels;
                 list[id].pixels = tapestry;
                 list[id].scale_max = scale;
@@ -541,7 +569,8 @@
 	    exit(0);
 	}
 
-        texture_id = makeTapestries(manager, texture_image, tex_id);
+        texture_info.texture_id = makeTapestries(manager, texture_image, tex_id);
+	tex_id = texture_info.texture_id;
 
         if (unlink(image_name)) {
             cout << "unlink error\n";
@@ -550,17 +579,17 @@
         /**
          * 以前に Load されている Texture を共用
          */
-        texture_id = tex_id;
+        texture_info.texture_id = tex_id;
     }
 
       // こんなことすると list[] のいみあるのかなーと
       // 微妙に思う、自分で書き換えた感想 by gongo
-      texture_info.t_w = list[texture_id].t_w;
-      texture_info.t_h = list[texture_id].t_h;;
-      texture_info.pixels_orig = list[texture_id].pixels_orig;
-      texture_info.pixels = list[texture_id].pixels;
-      texture_info.scale_max = list[texture_id].scale_max;
-      texture_info.texture_image = list[texture_id].texture_image;
+      texture_info.t_w = list[tex_id].t_w;
+      texture_info.t_h = list[tex_id].t_h;;
+      texture_info.pixels_orig = list[tex_id].pixels_orig;
+      texture_info.pixels = list[tex_id].pixels;
+      texture_info.scale_max = list[tex_id].scale_max;
+      texture_info.texture_image = list[tex_id].texture_image;
 
 }
 
@@ -601,6 +630,17 @@
     (*create_sg)(this->sgroot, property, update_property);
 }
 
+void
+SceneGraph::set_move_collision(move_func new_move)
+{
+    this->move = new_move;
+}
+
+void
+SceneGraph::set_move_collision(collision_func new_collision)
+{
+    this->collision = new_collision;
+}
 
 void
 SceneGraph::set_move_collision(move_func new_move,
--- a/Renderer/Engine/SceneGraph.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/SceneGraph.h	Fri Dec 17 00:18:36 2010 +0900
@@ -35,11 +35,11 @@
 	// とりあえず動かしたいので追加
 	int seq, seq_rd, resend_flag;
 
+    // task 生成用の情報
     int property_size;
     void *propertyptr;
     int move_id;
     int coll_id;
-    PostFunction post_func;
     memaddr property;
     memaddr update_property;
 
@@ -92,6 +92,8 @@
     SceneGraphPtr clone(void);
     SceneGraphPtr clone(void *buf);
     SceneGraphPtr searchSceneGraph(const char *name);
+    void set_move_collision(move_func new_move);
+    void set_move_collision(collision_func new_collision);
     void set_move_collision(move_func new_move, collision_func new_collision);
     void set_move_collision(move_func new_move, collision_func new_collision, void *sgroot);
     void set_move_collision(move_func new_move, collision_func new_collision, create_sg_func new_create_sg);
--- a/Renderer/Engine/SceneGraphRoot.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -3,12 +3,11 @@
 #include <libxml/parser.h>
 #include "SceneGraphRoot.h"
 #include "xml.h"
-#include "sys.h"
+#include "matrix_calc.h"
 #include "TextureHash.h"
 #include "texture.h"
 #include "Application.h"
 
-
 static int cnt = 0;
 static const int SGLIST_LENGTH = 138;
 static int sg_src_size = SGLIST_LENGTH ;
@@ -284,14 +283,35 @@
     return p;
 }
 
+
 void
-SceneGraphRoot::speExecute(int screen_w, int screen_h)
+SceneGraphRoot::lightCalc()
 {
+    int light_num = 4;
+    for (int i = 0; i < light_num; i++) {
+
+	get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, light[i]->scale, camera->matrix);
+      
+	light_vector[i*4] = 0.0f;
+	light_vector[i*4+1] = 0.0f;
+	light_vector[i*4+2] = 0.0f;
+	light_vector[i*4+3] = 1.0f;
 
-    SceneGraphPtr list = sg_available_list;
-    // SceneGraphPtr t = sg_exec_tree;
-    // SceneGraphPtr cur_parent = camera;
+	ApplyMatrix(&light_vector[i*4], light[i]->matrix);
+      
+	light_vector[i*4] /= light_vector[i*4+2];
+	light_vector[i*4+1] /= light_vector[i*4+2];
 
+	/*SIMD演算のため*/
+	light_vector[i*4+2] *= -1;
+	light_vector[i*4+3] *= -1;
+
+    }
+}
+
+void
+SceneGraphRoot::flip()
+{
     // 前フレームで描画した SceneGraph は削除
     allRemove(sg_remove_list);
 
@@ -303,65 +323,14 @@
     // 現フレームで新しく SceneGraph がコピーされるので初期化
     sg_exec_tree = NULL;
     sg_available_list = NULL;
-
-    camera->move_execute(screen_w, screen_h);
-    camera->update(screen_w, screen_h);
-
-    camera->children = NULL;
-    camera->lastChild = NULL;
-    
-    list->move_execute(screen_w, screen_h);
-    list->collision_check(screen_w, screen_h, list);	
-    
-    list->frame++; 
-    list = list->next;
-
-    if(sg_exec_tree != NULL) {
-	return;
-    }
-
-    /*removeのflagをもとにtreeを形成*/
-    /* spe から送り返されてきた property の配列を見て生成する for()*/
-    /*
-      for (Property *t = (Property*)app->property[0]; is_end(t); t++){
-      SceneGraphPtr s = app->scenegraph_factory(t); // SceneGraphNode を作る
-      t->scenegraph = s; // property list には SceneGraphへのポインタが入っている
-      app->scenegraph_connector(property[0], s); // add する
-      } 
-    */   
-    
-
-    // 現在、allExecute が終わった時点では
-    // camera->children が User SceneGraph の root になる
-
-    /**
-     * NULL じゃなかったら、setSceneData が呼ばれてるから
-     * そっちを次の Scene にする
-     */
-
-    sg_exec_tree = camera->children;
 }
 
-
-
 void
 SceneGraphRoot::allExecute(int screen_w, int screen_h)
 {
     SceneGraphPtr list = sg_available_list;
-    SceneGraphPtr t = sg_exec_tree;
-    SceneGraphPtr cur_parent = camera;
 
-    // 前フレームで描画した SceneGraph は削除
-    allRemove(sg_remove_list);
-
-    // 前フレームに作られた SceneGraph は描画用に移行
-    // 現フレームでの操作は以下の tree,list には適用されない
-    sg_draw_tree = sg_exec_tree;
-    sg_remove_list = sg_available_list;
-
-    // 現フレームで新しく SceneGraph がコピーされるので初期化
-    sg_exec_tree = NULL;
-    sg_available_list = NULL;
+    flip();
 
     camera->move_execute(screen_w, screen_h);
     camera->update(screen_w, screen_h);
@@ -379,44 +348,42 @@
         list = list->next;
     }    
 
-    int light_num = 4;
-    for (int i = 0; i < light_num; i++) {
-
-	get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
-      
-	light_vector[i*4] = 0.0f;
-	light_vector[i*4+1] = 0.0f;
-	light_vector[i*4+2] = 0.0f;
-	light_vector[i*4+3] = 1.0f;
+    lightCalc();
 
-	ApplyMatrix(&light_vector[i*4], light[i]->matrix);
-      
-	light_vector[i*4] /= light_vector[i*4+2];
-	light_vector[i*4+1] /= light_vector[i*4+2];
-
-	/*SIMD演算のため*/
-	light_vector[i*4+2] *= -1;
-	light_vector[i*4+3] *= -1;
-
-    }
-
-   
     if(sg_exec_tree != NULL) {
 	return;
     }
 
+    copyTree(sg_draw_tree, camera);
+
+    // 現在、allExecute が終わった時点では
+    // camera->children が User SceneGraph の root になる
+
+    /**
+     * NULL じゃなかったら、setSceneData が呼ばれてるから
+     * そっちを次の Scene にする
+     */
+
+    sg_exec_tree = camera->children;
+}
+   
+void
+SceneGraphRoot::copyTree(SceneGraphPtr t, SceneGraphPtr cur_parent)
+{
+    // SceneGraphPtr t = sg_draw_tree;
+
     /*removeのflagをもとにtreeを形成*/
     while (t) {
 	SceneGraphPtr c = NULL;
 	if (!t->isRemoved()) {
-	    c = t->clone();	    
+	    c = t->clone();
 	    addNext(c);
 	    cur_parent->addChild(c);
 	    c->frame = t->frame;
 	    /*親の回転、座標から、子の回転、座標を算出*/
-	    get_matrix(c->matrix, c->angle, c->xyz, cur_parent->matrix);
+	    get_matrix(c->matrix, c->angle, c->xyz, c->scale, cur_parent->matrix);
 	    /*法線用の行列。Cameraの行列を抜いている(Cameraのコンストラクタで、単位行列にしている)*/
-	    get_matrix(c->real_matrix, c->angle, c->xyz, cur_parent->real_matrix);
+	    get_matrix(c->real_matrix, c->angle, c->xyz, c->scale, cur_parent->real_matrix);
 	    //get_matrix(c->real_matrix, c->angle, c->xyz, camera->real_matrix);
 
 	} 
@@ -444,82 +411,8 @@
 	}
     }
 
-      
-
-    // 現在、allExecute が終わった時点では
-    // camera->children が User SceneGraph の root になる
-
-    /**
-     * NULL じゃなかったら、setSceneData が呼ばれてるから
-     * そっちを次の Scene にする
-     */
-
-    sg_exec_tree = camera->children;
 }
 
-void
-SceneGraphRoot::oneExecute(int screen_w, int screen_h)
-{
-    SceneGraphPtr list = sg_available_list;
-    //SceneGraphPtr t = sg_exec_tree;
-    //SceneGraphPtr cur_parent = camera;
-
-    // 前フレームで描画した SceneGraph は削除
-    allRemove(sg_remove_list);
-
-    // 前フレームに作られた SceneGraph は描画用に移行
-    // 現フレームでの操作は以下の tree,list には適用されない
-    sg_draw_tree = sg_exec_tree;
-    sg_remove_list = sg_available_list;
-
-    // 現フレームで新しく SceneGraph がコピーされるので初期化
-    sg_exec_tree = NULL;
-    sg_available_list = NULL;
-
-    camera->move_execute(screen_w, screen_h);
-    camera->update(screen_w, screen_h);
-
-    camera->children = NULL;
-    camera->lastChild = NULL;
-
-    /* ここから */
-    list->move_execute(screen_w, screen_h);
-    // ここで move_execute から実行される move_task の処理が終わるまで待ちたい
-    //while(move_finish_flag == 0) {}
-    //move_finish_flag = 0;
-
-    list->create_sg_execute();
-    
-    list->collision_check(screen_w, screen_h, list);	
-    /* ここまで exec_task にする */
-    
-    
-    /* ここから下を exec_task の post_func に*/
-    list->frame++; 
-    list = list->next;
-
-
-    int light_num = 4;
-    for (int i = 0; i < light_num; i++) {
-
-	get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
-      
-	light_vector[i*4] = 0.0f;
-	light_vector[i*4+1] = 0.0f;
-	light_vector[i*4+2] = 0.0f;
-	light_vector[i*4+3] = 1.0f;
-
-	ApplyMatrix(&light_vector[i*4], light[i]->matrix);
-      
-	light_vector[i*4] /= light_vector[i*4+2];
-	light_vector[i*4+1] /= light_vector[i*4+2];
-
-    }
-   
-    if(sg_exec_tree != NULL) {
-	return;
-    }
-}
 
 /*
   ExecMove task の post func として呼んでやる
@@ -535,7 +428,7 @@
     int light_num = 4;
     for (int i = 0; i < light_num; i++) {
 
-	get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, camera->matrix);
+	get_matrix(light[i]->matrix, light[i]->angle, light[i]->xyz, light[i]->scale, camera->matrix);
       
 	light_vector[i*4] = 0.0f;
 	light_vector[i*4+1] = 0.0f;
@@ -603,6 +496,37 @@
     return sg_exec_tree;
 }
 
+
+void
+printSceneGraph(SceneGraphPtr t)
+{
+    while (t) {
+	if (!t->isRemoved()) {
+	    if (t->name) printf("name: %s ",t->name);
+	    printf("x=%g y=%g z=%g\n",t->xyz[0],t->xyz[1],t->xyz[2]);
+	} 
+	if (t->children != NULL) {
+	    t = t->children;
+	} else if (t->brother != NULL) {
+	    t = t->brother;
+	} else {
+	    while (t) {
+		if (t->brother != NULL) {
+		    t = t->brother;
+		    break;
+		} else {
+		    if (t->parent == NULL) {
+			t = NULL;
+			break;
+		    } else {
+                        t = t->parent;
+		    }
+		}
+	    }	    
+	}
+    }
+}
+
 SceneGraphPtr
 SceneGraphRoot::getDrawSceneGraph()
 {
@@ -723,7 +647,7 @@
 }
 
 void
-SceneGraphRoot::set_game_task(int id, void *property, int size, PostFunction post_func)
+SceneGraphRoot::set_gtask_array(int id, void *property, int size, PostFunction post_func)
 {
     gtask_array->next_task_array(id);
 
@@ -733,7 +657,7 @@
 }
 
 void
-SceneGraphRoot::set_game_task(int id, void *property, void *pad, int size, PostFunction post_func)
+SceneGraphRoot::set_gtask_array(int id, void *property, void *pad, int size, PostFunction post_func)
 {
     gtask_array->next_task_array(id);
 
@@ -744,20 +668,40 @@
 }
 
 void
+SceneGraphRoot::set_game_task(int id, void *property, int size)
+{
+    HTask *task = sgroot->tmanager->create_task(id);
+    task->set_cpu(SPE_ANY);
+    task->add_inData(property, size);
+    task->add_outData(property, size);
+    task->spawn();
+}
+
+void
+SceneGraphRoot::set_game_task(int id, void *property, void *pad, int size)
+{
+    HTask *task = sgroot->tmanager->create_task(id);
+    task->set_cpu(SPE_ANY);
+    task->add_inData(property, size);
+    task->add_inData(pad, sizeof(Pad));
+    task->add_outData(property, size);
+    task->spawn();
+}
+
+
+void
 main_task_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h)
 {
     int size = node->property_size;
     void *e  = node->propertyptr;
     int move = node->move_id;
-    PostFunction post_func = node->post_func;
+    SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_;
 /*
-    ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr;
-    property->root = node;
+  ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr;
+  node->xyz[0] = property->x;
+  node->xyz[1] = property->y;
 */
-
-    SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_;
-
-    sgroottmp->set_game_task(move, (void*)e, size, post_func);
+    sgroottmp->set_game_task(move, (void*)e, size);
 }
 
 void
@@ -766,35 +710,32 @@
     int size = node->property_size;
     void *e  = node->propertyptr;
     int move = node->move_id;
-    PostFunction post_func = node->post_func;
-/*
-    ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr;
-    property->root = node;
-*/
-
     SceneGraphRoot *sgroottmp = (SceneGraphRoot*)sgroot_;
     void *pad = (void*)sgroottmp->getController();
 
-    sgroottmp->set_game_task(move, (void*)e, pad, size, post_func);
+/*
+    ObjPropertyPtr property = (ObjPropertyPtr)node->propertyptr;
+    property->root = node;
+    node->xyz[0] = property->x;
+    node->xyz[1] = property->y;
+*/
+
+    sgroottmp->set_game_task(move, (void*)e, pad, size);
 }
 
 void
-SceneGraphRoot::set_move_task(SceneGraphPtr node, int move, void *property, int size,
-			      PostFunction post_func)
+SceneGraphRoot::set_move_task(SceneGraphPtr node, int move, void *property, int size)
 {
     node->move = main_task_move;
-    node->post_func = post_func;
     node->move_id = move;
     node->propertyptr = property;
     node->property_size = size;
 }
 
 void
-SceneGraphRoot::set_pad_task(SceneGraphPtr node, int move, void *property, int size,
-			     PostFunction post_func)
+SceneGraphRoot::set_pad_task(SceneGraphPtr node, int move, void *property, int size)
 {
     node->move = pad_task_move;
-    node->post_func = post_func;
     node->move_id = move;
     node->propertyptr = property;
     node->property_size = size;
--- a/Renderer/Engine/SceneGraphRoot.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/SceneGraphRoot.h	Fri Dec 17 00:18:36 2010 +0900
@@ -112,14 +112,20 @@
     void task_array_init(int id, int task_num, int param, int inData_num, int outData_num);
     void create_task_array();
     void task_array_finish();
-    void set_game_task(int id, void *property, int size, PostFunction post_func);
-    void set_game_task(int id, void *property, void* pad, int size, PostFunction post_func);
-    void set_move_task(SceneGraphPtr node, int move, void *property, int size, PostFunction post_func);
-    void set_pad_task(SceneGraphPtr node, int move, void *property, int size, PostFunction post_func);
+    void set_gtask_array(int id, void *property, int size, PostFunction post_func);
+    void set_gtask_array(int id, void *property, void* pad, int size, PostFunction post_func);
+    void set_game_task(int id, void *property, int size);
+    void set_game_task(int id, void *property, void *pad, int size);
+    void set_move_task(SceneGraphPtr node, int move, void *property, int size);
+    void set_pad_task(SceneGraphPtr node, int move, void *property, int size);
 
     /* Other System API */
     void allExecute(int screen_w, int screen_h);
-    void oneExecute(int screen_w, int screen_h);
+    void lightCalc();
+    void flip();
+    void copyTree(SceneGraphPtr from, SceneGraphPtr to);
+
+    // void oneExecute(int screen_w, int screen_h);
     void checkRemove();
     SceneGraphPtr getExecuteSceneGraph();
     SceneGraphPtr getDrawSceneGraph();
@@ -130,8 +136,8 @@
     int* getLightSwitch();
     int getLightSysSwitch();
 
-    void speExecute(int screen_w, int screen_h);
-    void speExecute(int screen_w, int screen_h, Application *app);
+    // void speExecute(int screen_w, int screen_h);
+    // void speExecute(int screen_w, int screen_h, Application *app);
 
     /* System API */
     void registSceneGraph(SceneGraphPtr sg);
--- a/Renderer/Engine/SgChange.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/SgChange.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -4,7 +4,7 @@
 #include "SceneGraph.h"
 #include "SceneGraphRoot.h"
 #include "scene_graph_pack.h"
-#include "sys.h"
+#include "matrix_calc.h"
 #include "Func.h"
 #include "error.h"
 #include "TaskManager.h"
--- a/Renderer/Engine/TextureHash.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/TextureHash.h	Fri Dec 17 00:18:36 2010 +0900
@@ -16,6 +16,7 @@
     ~TextureHash(void);
     int hash_function(const char* image_name);
     int hash_regist(const char* image_name, int &tx_id);
+    void remove(int id) {  table[id].tx_id = -1; }
 };
 
 #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/matrix.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -0,0 +1,160 @@
+#include "matrix.h"
+
+// 完全にMac仕様。。sg_matrix を allocate してやらないといけないよ。
+float*
+copy_matrix(SceneGraphPtr sg, TaskManager *manager) {
+
+  float *matrix = sg->matrix;
+  float *real_matrix = sg->real_matrix;
+
+  //変換行列は4x4 なんで、16。が二つで32.と言い訳を書いてみる。
+  float *sg_matrix = (float*)manager->allocate(sizeof(float)*32);
+
+  for (int i = 0; i < 16; i++) {
+    sg_matrix[i] = matrix[i];
+    sg_matrix[i+16] = real_matrix[i];
+  }
+
+  return sg_matrix;
+
+}
+
+void
+print_matrix(float *matrix) {
+
+  for (int i = 0; i < 32; i++) {
+    printf("%f\n",matrix[i]);
+  }
+
+}
+
+void
+add_matrix_list(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) {
+
+    MatrixList *matrix_list = (MatrixList*)manager->allocate(sizeof(MatrixList));
+
+#if SPE_CREATE_POLYGON_CHECK
+    print_matrix(sg->sg_matrix);
+#endif    
+
+    matrix_list->matrix = copy_matrix(sg, manager);;
+    matrix_list->next = NULL;
+
+    
+    if (info->last != NULL) {
+        info->last->next = matrix_list;
+    }
+
+    info->last = matrix_list;
+    info->list_length += 1;
+
+}
+
+void
+new_matrix_info(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) {
+
+    MatrixListInfo *next = NULL;
+
+  if (info->id == -1) {
+
+    info->id = sg->sgid;
+    info->list_length = 1;
+    info->coord_pack = sg->coord_pack;
+    info->coord_pack_size = sg->coord_pack_size;
+    next = info;
+
+  } else {
+
+    MatrixListInfo* t;
+
+    for (t = info; t->next != NULL; t = t->next) {
+    }
+
+    next = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo));
+    next->id = sg->sgid;
+    next->list_length = 1;
+    next->coord_pack = sg->coord_pack;
+    next->coord_pack_size = sg->coord_pack_size;
+    next->next = NULL;
+    t->next = next;
+
+  }
+
+    MatrixList *new_list = (MatrixList*)manager->allocate(sizeof(MatrixList));
+    new_list->matrix = copy_matrix(sg, manager);
+
+#if SPE_CREATE_POLYGON_CHECK
+    print_matrix(sg->sg_matrix);
+#endif
+
+    new_list->next = NULL;
+
+    next->first = new_list;
+    next->last = new_list;
+
+}
+
+void
+collect_matrix(SceneGraphPtr sg, MatrixListInfo *matrix_info, TaskManager *manager) {
+  
+  matrix_info->id = -1;
+  matrix_info->list_length = 0;
+  matrix_info->next = NULL;
+  matrix_info->first = NULL;
+  matrix_info->last = NULL;
+
+  while (sg) {
+    
+    if (sg->flag_drawable) {
+      
+      int flag = 0;
+      
+      for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) {
+	if (sg->sgid == t->id) {
+	  add_matrix_list(sg, manager, t);
+	  flag = 1;
+	}	    	    	    
+      }
+      
+      if (flag != 1) {
+	new_matrix_info(sg, manager, matrix_info);  
+      }
+      
+      // search SceneGraph. でも、ただのリストがあったハズだから、あとでそれに直す。はず・・
+      if (sg->children != NULL) {
+	  sg = sg->children;
+      } else if (sg->brother != NULL) {
+	sg = sg->brother;
+      } else {
+	while (sg) {
+	  if (sg->brother != NULL) {
+	    sg = sg->brother;
+	      break;
+	  } else {
+	    if (sg->parent == NULL) {
+	      sg = NULL;
+	      break;
+	    } else {
+	      sg = sg->parent;
+	    }
+	  }
+	}
+      } 
+    } 
+  }
+}
+
+void
+check_matrix(MatrixListInfo *matrix_info,SceneGraphPtr sg) {
+
+  for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) {
+    for (MatrixList* u = t->first; u != NULL; u = u->next) {
+      print_matrix(u->matrix);
+    }
+  }
+
+}
+
+
+
+/* end */
--- a/Renderer/Engine/matrix.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/matrix.h	Fri Dec 17 00:18:36 2010 +0900
@@ -1,6 +1,9 @@
 #ifndef INCLUDED_MATRIX
 #define INCLUDED_MATRIX
 
+#include "TaskManager.h"
+#include "SceneGraphRoot.h"
+
     struct MatrixList {
       float *matrix;
       MatrixList *next;
@@ -17,4 +20,22 @@
       MatrixListInfo *next;
     };
 
+
+extern float* copy_matrix(SceneGraphPtr sg, TaskManager *manager) ;
+
+extern void print_matrix(float *matrix) ;
+
+
+extern void add_matrix_list(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) ;
+
+
+extern void new_matrix_info(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) ;
+
+
+extern void collect_matrix(SceneGraphPtr sg, MatrixListInfo *matrix_info, TaskManager *manager) ;
+  
+
+extern void check_matrix(MatrixListInfo *matrix_info,SceneGraphPtr sg) ;
+
 #endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/matrix_calc.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -0,0 +1,285 @@
+#include <stdlib.h>
+#include <iostream>
+#include <string.h>
+#include <math.h>
+#include "matrix_calc.h"
+using namespace std;
+
+void noMoreMemory()
+{
+  cout << "can't allocate memory\n";
+  exit(1);
+}
+
+void
+transMatrix(float *m0, float *m1, float *v)
+{
+    memcpy(m0, m1, sizeof(float)*16);
+
+    m0[12] = m1[12] + v[0];
+    m0[13] = m1[13] + v[1];
+    m0[14] = m1[14] + v[2];
+    m0[15] = m1[15] + v[3];
+}
+
+void
+unitMatrix(float *m)
+{
+    bzero(m, sizeof(float)*16);
+
+    m[0] = 1.0f;
+    m[5] = 1.0f;
+    m[10] = 1.0f;
+    m[15] = 1.0f;
+}
+
+void
+inversMatrix(float *m0, float *m1)
+{
+    float m[16];
+
+    for (int i = 0; i < 4; i++) {
+	for (int j = 0; j < 4; j++) {
+	    m[i*4+j] = m1[j*4+i];
+	}
+    }
+
+    m[12] = -(m1[12]*m[0] + m1[13]*m[1] + m1[14]*m[2]);
+    m[13] = -(m1[12]*m[4] + m1[13]*m[5] + m1[14]*m[6]);
+    m[14] = -(m1[12]*m[8] + m1[13]*m[9] + m1[14]*m[10]);
+    m[3] = m[7] = m[11] = 0.0f;
+    m[15] = 1.0f;
+
+    memcpy(m0, m, sizeof(float)*16);
+}
+
+/**
+ * マトリックス m にベクトル v1 を右から乗算して、v0に与える
+ * @param[out] v0 output vector (float[4])
+ * @param[in] v1 input vector (float[4])
+ * @param[in] m matrix (float[16])
+ */
+void
+applyMatrix(float *v0, float *m, float *v1)
+{
+    for (int i = 0; i < 4; i++) {
+	v0[i] = v1[0]*m[i] + v1[1]*m[i+4] + v1[2]*m[i+8] + v1[3]*m[i+12];
+    }
+}
+
+/**
+ * ベクトルの正規化
+ *
+ * @param[out] v0 output vector
+ * @param[in]  v1 input vector
+ */
+void
+normalize(float *v0, float *v1)
+{
+    float norm, dnorm;
+
+    norm = sqrt(v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]);
+    if (norm > 0) {
+	dnorm = 1.0/norm;
+	v0[0] = v1[0]*dnorm;
+	v0[1] = v1[1]*dnorm;
+	v0[2] = v1[2]*dnorm;
+	v0[3] = v1[3]*dnorm;
+    }
+}
+
+/**
+ * ベクトルの減算 v0 = v1 - v2
+ */
+void
+subVector(float *v0, float *v1, float *v2)
+{
+    v0[0] = v1[0] - v2[0];
+    v0[1] = v1[1] - v2[1];
+    v0[2] = v1[2] - v2[2];
+    v0[3] = v1[3] - v2[3];
+}
+
+/**
+ * ベクトルの外積 v0 = v1 x v2
+ */
+void
+outerProduct(float *v0, float *v1, float *v2)
+{
+    v0[0] = v1[1] * v2[2] - v1[2] * v2[1];
+    v0[1] = v1[2] * v2[0] - v1[0] * v2[2];
+    v0[2] = v1[0] * v2[1] - v1[1] * v2[0];
+    v0[3] = 0;
+}
+
+void
+transposeMatrix(float *m0, float *m1)
+{
+    float t[16];
+
+    for (int i = 0; i < 4; i++) {
+	for (int j = 0; j < 4; j++) {
+	    t[i*4+j] = m1[j*4+i];
+	}
+    }
+
+    memcpy(m0, t, sizeof(float)*16);
+}
+
+/**
+ * ベクトルの内積 f = v0 * v1
+ */
+float
+innerProduct(float *v0, float *v1)
+{
+    return (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]);
+}
+
+void matrix4x4(float *xyz, float *xyz1, float *xyz2) //xyz[16]
+{
+  for(int t=0; t<16; t+=4)
+    {
+      for(int i=0; i<4; i++)
+	{
+	  xyz[t+i] = xyz1[t]*xyz2[i] + xyz1[t+1]*xyz2[4+i] + xyz1[t+2]*xyz2[8+i] + xyz1[t+3]*xyz2[12+i];
+	}
+    }
+}
+
+/**
+       stack 上の変換行列に、相対的に、rxyz の回転、txyz の平行移動、scale の拡大を
+       行ったものを matrix に代入する
+ */
+void
+get_matrix( float *matrix, float *rxyz, float *txyz, float *scale, float *stack)
+{
+  float radx,rady,radz;
+  radx = rxyz[0]*3.14/180;
+  rady = rxyz[1]*3.14/180;
+  radz = rxyz[2]*3.14/180;
+
+  float sinx = sin(radx);
+  float cosx = cos(radx);
+  float siny = sin(rady);
+  float cosy = cos(rady);
+  float sinz = sin(radz);
+  float cosz = cos(radz);
+
+  float m1[16];
+  float *m = stack? m1 : matrix;
+
+  /* View Transform */
+  m[0] = cosz*cosy+sinz*sinx*siny;
+  m[1] = sinz*cosx;
+  m[2] = -cosz*siny+sinz*sinx*cosy;
+  m[3] = 0;
+  m[4] = -sinz*cosy+cosz*sinx*siny;
+  m[5] = cosz*cosx;
+  m[6] = sinz*siny+cosz*sinx*cosy;
+  m[7] = 0;
+  m[8] = cosx*siny;
+  m[9] = -sinx;
+  m[10] = cosx*cosy;
+  m[11] = 0;
+  m[12] = txyz[0];
+  m[13] = txyz[1];
+  m[14] = txyz[2];
+  m[15] = 1;
+  
+  if(stack)
+    {
+	matrix4x4(matrix, m, stack);
+    }
+
+    matrix[0] *= scale[0];
+    matrix[1] *= scale[0];
+    matrix[2] *= scale[0];
+    matrix[4] *= scale[1];
+    matrix[5] *= scale[1];
+    matrix[6] *= scale[1];
+    matrix[8] *= scale[2];
+    matrix[9] *= scale[2];
+    matrix[10] *= scale[2];
+
+}
+
+void rotate_x(float *xyz, float r)
+{
+  float rad = r*3.14/180;
+
+  xyz[0] = xyz[0];
+  xyz[1] = xyz[1]*cos(rad) - xyz[2]*sin(rad);
+  xyz[2] = xyz[1]*sin(rad) + xyz[2]*cos(rad);
+}
+
+void rotate_y(float *xyz, float r)
+{
+  float rad = r*3.14/180;
+
+  xyz[0] = xyz[0]*cos(rad) + xyz[2]*sin(rad);
+  xyz[1] = xyz[1];
+  xyz[2] = -xyz[0]*sin(rad) + xyz[2]*cos(rad);
+}
+
+void rotate_z(float *xyz, float r)
+{
+  float rad = r*3.14/180;
+
+  xyz[0] = xyz[0]*cos(rad) - xyz[1]*sin(rad);
+  xyz[1] = xyz[0]*sin(rad) + xyz[1]*cos(rad);
+  xyz[2] = xyz[2];
+}
+
+void rotate(float *xyz, float *matrix)
+{
+  float abc[4];
+  abc[0] = xyz[0];
+  abc[1] = xyz[1];
+  abc[2] = xyz[2];
+  abc[3] = xyz[3];
+
+  for(int i=0; i<4; i++)
+    {
+      //xyz[i] = abc[0]*rot[i] + abc[1]*rot[i+4] + abc[2]*rot[i+8] + abc[3]*rot[i+12];
+      xyz[i] = abc[0]*matrix[i] + abc[1]*matrix[i+4] + abc[2]*matrix[i+8] + abc[3]*matrix[i+12];
+    }
+}
+
+
+void translate(float *xyz, float x, float y, float z)
+{
+  xyz[0] += x;
+  xyz[1] += y;
+  xyz[2] += z;
+}
+
+/**                                                                                       
+ *  ベクトルに行列を乗算する                                                              
+ * @param[out] v vector (float[4])                                                        
+ * @param[in] m matrix (float[16])                                                        
+ */
+void
+ApplyMatrix(float *v, float *m)
+{
+  float t[4];
+
+  t[0] = v[0];
+  t[1] = v[1];
+  t[2] = v[2];
+  t[3] = v[3];
+
+  for (int i = 0; i < 4; i++) {
+    v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12];
+  }
+}
+
+void
+ScaleMatrixXYZ(float *m, float x, float y, float z)
+{
+    for(int i=0;i<3;i++) {
+       m[i] *= x;
+       m[i+4] *= y;
+       m[i+8] *= z;
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/Engine/matrix_calc.h	Fri Dec 17 00:18:36 2010 +0900
@@ -0,0 +1,29 @@
+#ifndef CR_SYS_H
+#define CR_SYS_H
+
+void noMoreMemory();
+void get_matrix(float *matrix, float *rxyz, float *txyz, float *scale, float *stack);
+void rotate_x(float *xyz, float r);
+void rotate_y(float *xyz, float r);
+void rotate_z(float *xyz, float r);
+//void rotate(float *xyz, float *matrix, float *rxyz, float *txyz, float *stack[]);
+void rotate(float *xyz, float *matrix);
+void translate(float *xyz, float x, float y, float z);
+void matrix4x4(float *, float *, float *);
+
+void normalize(float *v0, float *v1);
+void subVector(float *v0, float *v1, float *v2);
+void outerProduct(float *v0, float *v1, float *v2);
+float innerProduct(float *v0, float *v1);
+void applyMatrix(float *v0, float *m, float *v1);
+void inversMatrix(float *m0, float *m1);
+void transposeMatrix(float *m0, float *m1);
+void unitMatrix(float *m);
+void transMatrix(float *m0, float *m1, float *v);
+void ApplyMatrix(float *v1, float *v2);
+void ScaleMatrix(float *m, float v);
+void ScaleMatrixXYZ(float *m, float sx,float sy, float sz);
+static inline unsigned long align(unsigned long x,unsigned long alig) { return ((x+(alig-1))&~(alig-1)); }
+
+
+#endif
--- a/Renderer/Engine/polygon.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/polygon.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -4,7 +4,7 @@
 #include <SDL_image.h>
 #include "polygon.h"
 #include "xml.h"
-#include "sys.h"
+#include "matrix_calc.h"
 #include "triangle.h"
 #include "vertex.h"
 #include "Span.h"
@@ -14,34 +14,10 @@
 #include "viewer_types.h"
 using namespace std;
 
-//extern int decode(char *cont, char *file_name);
-extern int decode(char *cont, FILE *outfile);
-
 
 Polygon::Polygon(void)
 {
-    xyz[0] = 0;
-    xyz[1] = 0;
-    xyz[2] = 0;
-    xyz[3] = 1;
-    c_xyz[0] = 0;
-    c_xyz[1] = 0;
-    c_xyz[2] = 0;
-    c_xyz[3] = 1;
-    angle[0] = 0;
-    angle[1] = 0;
-    angle[2] = 0;
-    angle[3] = 1;
-
-
-#if !SPE_CREATE_POLYGON
-
-    for (int i = 0; i < 16; i++) {
-        matrix[i] = 0;
-    }
-
-#endif
-
+    position_init();
 }
 
 void
@@ -59,6 +35,9 @@
     angle[1] = 0;
     angle[2] = 0;
     angle[3] = 1;
+    scale[0] = 1;
+    scale[1] = 1;
+    scale[2] = 1;
 
 
 #if !SPE_CREATE_POLYGON
@@ -71,122 +50,6 @@
 
 }
 
-#if 0
-void Polygon::draw(SceneGraphPack *sgp)
-{
-    float xyz1[4],xyz2[4],xyz3[4];
-
-    /***SceneGraphUpdate***/
-    //sgp_update();
-    for (int i = 0; i < sgp->info.size; i++) {
-        SceneGraphNode node = sgp->node[i];
-
-        /***draw***/
-        int n,nt;
-        for(n=0,nt=0; n<node.size*3; n+=9,nt+=6) {
-            xyz1[0] = node.vertex[n];
-            xyz1[1] = node.vertex[n+1];
-            xyz1[2] = node.vertex[n+2]*-1;
-            xyz1[3] = 1;
-            xyz2[0] = node.vertex[n+3];
-            xyz2[1] = node.vertex[n+3+1];
-            xyz2[2] = node.vertex[n+3+2]*-1;
-            xyz2[3] = 1;
-            xyz3[0] = node.vertex[n+6];
-            xyz3[1] = node.vertex[n+6+1];
-            xyz3[2] = node.vertex[n+6+2]*-1;
-            xyz3[3] = 1;
-
-            rotate(xyz1, node.translation);
-            rotate(xyz2, node.translation);
-            rotate(xyz3, node.translation);
-
-            Vertex *ver1 = new Vertex(xyz1[0],xyz1[1],xyz1[2],node.texture[nt],node.texture[nt+1]);
-            Vertex *ver2 = new Vertex(xyz2[0],xyz2[1],xyz2[2],node.texture[nt+2],node.texture[nt+2+1]);
-            Vertex *ver3 = new Vertex(xyz3[0],xyz3[1],xyz3[2],node.texture[nt+4],node.texture[nt+4+1]);
-
-            Triangle *tri = new Triangle(ver1,ver2,ver3);
-            Span_c *span = new Span_c();
-            span->viewer = viewer;
-            span->p = this;
-            span->create_span(tri,texture_image);
-            delete ver1;
-            delete ver2;
-            delete ver3;
-            delete tri;
-            delete span;
-        }
-    }
-}
-
-
-void Polygon::draw(PolygonPack *pp)
-{
-    for(int n=0; n<pp->info.size; n++)
-    {
-        Vertex *ver1 = new Vertex(pp->tri[n].ver1.x,pp->tri[n].ver1.y,pp->tri[n].ver1.z,pp->tri[n].ver1.tex_x,pp->tri[n].ver1.tex_y);
-        Vertex *ver2 = new Vertex(pp->tri[n].ver2.x,pp->tri[n].ver2.y,pp->tri[n].ver2.z,pp->tri[n].ver2.tex_x,pp->tri[n].ver2.tex_y);
-        Vertex *ver3 = new Vertex(pp->tri[n].ver3.x,pp->tri[n].ver3.y,pp->tri[n].ver3.z,pp->tri[n].ver3.tex_x,pp->tri[n].ver3.tex_y);
-
-        Triangle *tri = new Triangle(ver1,ver2,ver3);
-        Span_c *span = new Span_c();
-        span->viewer = viewer;
-        span->p = this;
-        span->create_span(tri,texture_image);
-        delete ver1;
-        delete ver2;
-        delete ver3;
-        delete tri;
-        delete span;
-    }
-}
-
-void Polygon::draw(SpanPack *sp)
-{
-    Span *span;
-
-    for (int n = 0; n < sp->info.size; n++) {
-        span = &sp->span[n];
-
-        //int x = span->x;
-        //int y = span->y;
-        float z = span->start_z;
-        int end = span->length_x;
-        float zpos = span->end_z;
-        float tex1 = span->tex_x1;
-        float tex2 = span->tex_x2;
-        float tey1 = span->tex_y1;
-        float tey2 = span->tex_y2;
-        Uint32 rgb;
-        int tex_xpos;
-        int tex_ypos;
-        int tex_zpos;
-        float tex_x, tex_y, tex_z;
-
-        if (end == 1) {
-            tex_xpos = (int)((span->tex_height-1) * tex1);
-            tex_ypos = (int)((span->tex_width-1) * tey1);
-            tex_zpos = (int)z;
-            rgb = get_rgb(tex_xpos, tex_ypos);
-            //viewer->write_pixel(x, y, zpos, rgb);
-        } else {
-            for (int j = 0; j < end; j++) {
-                tex_x = tex1*(end-1-j)/(end-1) + tex2*j/(end-1);
-                tex_y = tey1*(end-1-j)/(end-1) + tey2*j/(end-1);
-                tex_z = z*(end-1-j)/(end-1) + zpos*j/(end-1);
-                if (tex_x > 1) tex_x = 1;
-                if (tex_y > 1) tex_y = 1;
-                tex_xpos = (int)((span->tex_height-1) * tex_x);
-                tex_ypos = (int)((span->tex_width-1) * tex_y);
-                rgb = get_rgb(tex_xpos,tex_ypos);
-                //viewer->write_pixel(j + x, y, tex_z, rgb);
-            }
-        }
-    }
-}
-
-#endif
-
 void Polygon::pickup_coordinate(char *cont)
 {
 
@@ -388,38 +251,17 @@
     //Uint32 temp, pixel;
     Uint8 red, green, blue;
 
-    fmt = texture_image->format;
+    fmt = texture_info.texture_image->format;
 
     if (tx<0) tx = 0;
-    if (texture_image->w-1< tx) tx = texture_image->w-1 ;
+    if (texture_info.texture_image->w-1< tx) tx = texture_info.texture_image->w-1 ;
     if (ty<0) ty = 0;
-    if (texture_image->h-1< ty) ty = texture_image->h-1 ;
+    if (texture_info.texture_image->h-1< ty) ty = texture_info.texture_image->h-1 ;
 
 
 
     //SDL_LockSurface(texture_image);
-    char *p = get_pixel(tx,ty,texture_image);
-#if 0
-    pixel = my_ntohl(*(Uint32*)p);
-    //printf("pixel = %d\n", pixel);
-    //printf("pixel %x bpp = %d ",p, fmt->BytesPerPixel);
-    //SDL_UnlockSurface(texture_image);
-
-    temp = pixel&fmt->Rmask;
-    temp = temp>>fmt->Rshift;
-    temp = temp<<fmt->Rloss;
-    red = (Uint8)temp;
-
-    temp = pixel&fmt->Gmask;
-    temp = temp>>fmt->Gshift;
-    temp = temp<<fmt->Gloss;
-    green = (Uint8)temp;
-
-    temp = pixel&fmt->Bmask;
-    temp = temp>>fmt->Bshift;
-    temp = temp<<fmt->Bloss;
-    blue = (Uint8)temp;
-#endif
+    char *p = get_pixel(tx,ty,texture_info.texture_image);
     blue  = (Uint8) p[0];
     green = (Uint8) p[1];
     red   = (Uint8) p[2];
--- a/Renderer/Engine/polygon.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/polygon.h	Fri Dec 17 00:18:36 2010 +0900
@@ -28,9 +28,7 @@
     float angle[4];   // angle
     float c_xyz[4];   // center of rotation
     float *anim;
-    int texture_id; //texture id number
-
-    SDL_Surface* texture_image;
+    float scale[3];
 
     Polygon(void);
 
--- a/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/spe/CreatePolygonFromSceneGraph.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -8,7 +8,7 @@
 #include "polygon_pack.h"
 #include "scene_graph_pack.h"
 
-SchedDefineTask(CreatePolygonFromSceneGraph);
+SchedDefineTask1(CreatePolygonFromSceneGraph, createPolygonFromSceneGraph);
 
 #define SG_PACK_LOAD 10
 #define SG_NODE_LOAD 11
@@ -50,20 +50,61 @@
 }
 
 static int 
-run(SchedTask *smanager, void *rbuf, void *wbuf)
+createPolygonFromSceneGraph(SchedTask *smanager, void *rbuf, void *wbuf)
 {
     float xyz1[4], xyz2[4], xyz3[4];
     float normal1[4],normal2[4],normal3[4];
 
     //coord_xyz, coord_tex, normal, matrix, real_matrix を受け取る
-    float *coord_xyz   = (float)smanager->get_inData(0);
-    float *coord_tex   = (float)smanager->get_inData(1);
-    float *normal      = (float)smanager->get_inData(2);
-    float *matrix      = (float)smanager->get_inData(3);
-    float *real_matrix = (float)smanager->get_inData(4);
-    TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_inData(5);
+    float *coord_xyz   = (float*)smanager->get_input(rbuf, 0);
+    float *coord_tex   = (float*)smanager->get_input(rbuf, 1);
+    float *normal      = (float*)smanager->get_input(rbuf, 2);
+    float *matrix      = (float*)smanager->get_input(rbuf, 3);
+    float *real_matrix = (float*)smanager->get_input(rbuf, 4);
+    uint32 *pixels     = (uint32*)smanager->get_input(rbuf, 5);
+
+    int sg_size   = (int)smanager->get_param(0);
+    int width     = (int)smanager->get_param(1);
+    int height    = (int)smanager->get_param(2);
+    int scale_max = (int)smanager->get_param(3);
+
+    // triangle を書き戻す
+    //TrianglePackPtr triangle = (TrianglePackPtr)smanager->get_output(wbuf, 0);
+
+    PolygonPackPtr pp
+	= (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack));
+    PolygonPackPtr send_pp
+	= (PolygonPackPtr)smanager->allocate(sizeof(PolygonPack));
+    PolygonPackPtr pp_addr = (PolygonPackPtr)smanager->get_param(1);
+    PolygonPackPtr tmp_pp;
+
 
-    for (int i = 0; i < sg->size; i += 3) {
+    for (int i = 0; i < sg_size; i += 3) {
+      if (pp->info.size >= MAX_SIZE_TRIANGLE) {
+	PolygonPackPtr next;
+	
+	smanager->mainMem_alloc(0, sizeof(PolygonPack));
+	smanager->mainMem_wait();
+	next = (PolygonPackPtr)smanager->mainMem_get(0);
+	
+	pp->next = next;
+	
+	tmp_pp = pp;
+	pp = send_pp;
+	send_pp = tmp_pp;
+	
+	smanager->dma_wait(PP_STORE);
+	smanager->dma_store(send_pp, (memaddr)pp_addr,
+			    sizeof(PolygonPack), PP_STORE);
+	
+	pp_addr = next;
+	
+	smanager->dma_wait(PP_LOAD);
+	smanager->dma_load(pp, (memaddr)pp_addr,
+			   sizeof(PolygonPack), PP_LOAD);
+	smanager->dma_wait(PP_LOAD);
+	pp->init();
+      }
       
       xyz1[0] = coord_xyz[(i+0)*3];
       xyz1[1] = coord_xyz[(i+0)*3+1];
@@ -92,6 +133,8 @@
       xyz3[0] /= xyz3[2];
       xyz3[1] /= xyz3[2];
    
+      TrianglePack *triangle = &pp->tri[pp->info.size++];
+
       triangle->ver1.x = xyz1[0];
       triangle->ver1.y = xyz1[1];
       triangle->ver1.z = xyz1[2];
@@ -110,20 +153,20 @@
       triangle->ver3.tex_x = coord_tex[(i+2)*3];
       triangle->ver3.tex_y = coord_tex[(i+2)*3+1];
       
-      normal1[0] = sg->normal[(i+0)*3];
-      normal1[1] = sg->normal[(i+0)*3+1];
-      normal1[2] = sg->normal[(i+0)*3+2]*-1.0f;
+      normal1[0] = normal[(i+0)*3];
+      normal1[1] = normal[(i+0)*3+1];
+      normal1[2] = normal[(i+0)*3+2]*-1.0f;
       //normal1[3] = 1.0f;
       normal1[3] = 0.0f;
       
-      normal2[0] = sg->normal[(i+1)*3];
-      normal2[1] = sg->normal[(i+1)*3+1];
-      normal2[2] = sg->normal[(i+1)*3+2]*-1.0f;
+      normal2[0] = normal[(i+1)*3];
+      normal2[1] = normal[(i+1)*3+1];
+      normal2[2] = normal[(i+1)*3+2]*-1.0f;
       //normal2[3] = 1.0f;
       normal2[3] = 0.0f;
       
-      normal3[0] = sg->normal[(i+2)*3];
-      normal3[1] = sg->normal[(i+2)*3+1];
+      normal3[0] = normal[(i+2)*3];
+      normal3[1] = normal[(i+2)*3+1];
       normal3[2] = normal[(i+2)*3+2]*-1.0f;
       //normal3[3] = 1.0f;
       normal3[3] = 0.0f;
@@ -153,10 +196,18 @@
       triangle->normal3.y = normal3[1];
       triangle->normal3.z = normal3[2];
       
-      triangle->tex_info.addr   = sg->texture_info.pixels;
-      triangle->tex_info.width  = sg->texture_info.t_w;
-      triangle->tex_info.height = sg->texture_info.t_h;
-      triangle->tex_info.scale_max = sg->texture_info.scale_max;
+      triangle->tex_info.addr   = pixels;
+      triangle->tex_info.width  = width;
+      triangle->tex_info.height = height;
+      triangle->tex_info.scale_max = scale_max;
     }
+    smanager->dma_wait(PP_STORE);
+    smanager->dma_store(pp, (memaddr)pp_addr,
+			sizeof(PolygonPack), PP_STORE);
+    smanager->dma_wait(PP_STORE);
+
+    free(pp);
+    free(send_pp);
+
     return 0;
 }
--- a/Renderer/Engine/spe/DrawSpan.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/spe/DrawSpan.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -1,11 +1,11 @@
 #include <stdlib.h>
 #include <string.h>
+#include "polygon_pack.h"
 #include "DrawSpan.h"
-#include "polygon_pack.h"
 #include "task_texture.h"
 #include "viewer_types.h"
 #include "Func.h"
-#include "sys.h"
+#include "matrix_calc.h"
 #include "SchedTask.h"
 #include "Tapestry.h"
 #include "SpanPack.h"
@@ -225,7 +225,7 @@
 #endif
 
     //完全に透けているか判断
-    int flag = (alpha != 0 && normal_z < 0);
+    int flag = (alpha != 0);
     int *light_sysswitch = (int*)smanager->global_get(LightSysSwitch);
     //smanager->printf("sys %d\n",light_sysswitch);
 
--- a/Renderer/Engine/spe/Makefile	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/spe/Makefile	Fri Dec 17 00:18:36 2010 +0900
@@ -5,7 +5,8 @@
 TOP = ../$(CERIUM)
 
 SRCS_TMP = $(wildcard *.cc)
-#SRCS_EXCLUDE = CreatePolygon.cc
+SRCS_EXCLUDE = CreatePolygonFromSceneGraph.cc #CreatePolygon.cc 
+#SRCS_EXCLUDE = CreatePolygon.cc 
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/Renderer/Engine/sys.cc	Fri Nov 05 22:43:25 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,264 +0,0 @@
-#include <stdlib.h>
-#include <iostream>
-#include <string.h>
-#include <math.h>
-#include "sys.h"
-using namespace std;
-
-void noMoreMemory()
-{
-  cout << "can't allocate memory\n";
-  exit(1);
-}
-
-void
-transMatrix(float *m0, float *m1, float *v)
-{
-    memcpy(m0, m1, sizeof(float)*16);
-
-    m0[12] = m1[12] + v[0];
-    m0[13] = m1[13] + v[1];
-    m0[14] = m1[14] + v[2];
-    m0[15] = m1[15] + v[3];
-}
-
-void
-unitMatrix(float *m)
-{
-    bzero(m, sizeof(float)*16);
-
-    m[0] = 1.0f;
-    m[5] = 1.0f;
-    m[10] = 1.0f;
-    m[15] = 1.0f;
-}
-
-void
-inversMatrix(float *m0, float *m1)
-{
-    float m[16];
-
-    for (int i = 0; i < 4; i++) {
-	for (int j = 0; j < 4; j++) {
-	    m[i*4+j] = m1[j*4+i];
-	}
-    }
-
-    m[12] = -(m1[12]*m[0] + m1[13]*m[1] + m1[14]*m[2]);
-    m[13] = -(m1[12]*m[4] + m1[13]*m[5] + m1[14]*m[6]);
-    m[14] = -(m1[12]*m[8] + m1[13]*m[9] + m1[14]*m[10]);
-    m[3] = m[7] = m[11] = 0.0f;
-    m[15] = 1.0f;
-
-    memcpy(m0, m, sizeof(float)*16);
-}
-
-/**
- * マトリックス m にベクトル v1 を右から乗算して、v0に与える
- * @param[out] v0 output vector (float[4])
- * @param[in] v1 input vector (float[4])
- * @param[in] m matrix (float[16])
- */
-void
-applyMatrix(float *v0, float *m, float *v1)
-{
-    for (int i = 0; i < 4; i++) {
-	v0[i] = v1[0]*m[i] + v1[1]*m[i+4] + v1[2]*m[i+8] + v1[3]*m[i+12];
-    }
-}
-
-/**
- * ベクトルの正規化
- *
- * @param[out] v0 output vector
- * @param[in]  v1 input vector
- */
-void
-normalize(float *v0, float *v1)
-{
-    float norm, dnorm;
-
-    norm = sqrt(v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]);
-    if (norm > 0) {
-	dnorm = 1.0/norm;
-	v0[0] = v1[0]*dnorm;
-	v0[1] = v1[1]*dnorm;
-	v0[2] = v1[2]*dnorm;
-	v0[3] = v1[3]*dnorm;
-    }
-}
-
-/**
- * ベクトルの減算 v0 = v1 - v2
- */
-void
-subVector(float *v0, float *v1, float *v2)
-{
-    v0[0] = v1[0] - v2[0];
-    v0[1] = v1[1] - v2[1];
-    v0[2] = v1[2] - v2[2];
-    v0[3] = v1[3] - v2[3];
-}
-
-/**
- * ベクトルの外積 v0 = v1 x v2
- */
-void
-outerProduct(float *v0, float *v1, float *v2)
-{
-    v0[0] = v1[1] * v2[2] - v1[2] * v2[1];
-    v0[1] = v1[2] * v2[0] - v1[0] * v2[2];
-    v0[2] = v1[0] * v2[1] - v1[1] * v2[0];
-    v0[3] = 0;
-}
-
-void
-transposeMatrix(float *m0, float *m1)
-{
-    float t[16];
-
-    for (int i = 0; i < 4; i++) {
-	for (int j = 0; j < 4; j++) {
-	    t[i*4+j] = m1[j*4+i];
-	}
-    }
-
-    memcpy(m0, t, sizeof(float)*16);
-}
-
-/**
- * ベクトルの内積 f = v0 * v1
- */
-float
-innerProduct(float *v0, float *v1)
-{
-    return (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]);
-}
-
-void matrix4x4(float *xyz, float *xyz1, float *xyz2) //xyz[16]
-{
-  for(int t=0; t<16; t+=4)
-    {
-      for(int i=0; i<4; i++)
-	{
-	  xyz[t+i] = xyz1[t]*xyz2[i] + xyz1[t+1]*xyz2[4+i] + xyz1[t+2]*xyz2[8+i] + xyz1[t+3]*xyz2[12+i];
-	}
-    }
-}
-
-void get_matrix( float *matrix, float *rxyz, float *txyz, float *stack)
-{
-  float radx,rady,radz;
-  radx = rxyz[0]*3.14/180;
-  rady = rxyz[1]*3.14/180;
-  radz = rxyz[2]*3.14/180;
-
-  float sinx = sin(radx);
-  float cosx = cos(radx);
-  float siny = sin(rady);
-  float cosy = cos(rady);
-  float sinz = sin(radz);
-  float cosz = cos(radz);
-
-  /* View Transform */
-  matrix[0] = cosz*cosy+sinz*sinx*siny;
-  matrix[1] = sinz*cosx;
-  matrix[2] = -cosz*siny+sinz*sinx*cosy;
-  matrix[3] = 0;
-  matrix[4] = -sinz*cosy+cosz*sinx*siny;
-  matrix[5] = cosz*cosx;
-  matrix[6] = sinz*siny+cosz*sinx*cosy;
-  matrix[7] = 0;
-  matrix[8] = cosx*siny;
-  matrix[9] = -sinx;
-  matrix[10] = cosx*cosy;
-  matrix[11] = 0;
-  matrix[12] = txyz[0];
-  matrix[13] = txyz[1];
-  matrix[14] = txyz[2];
-  matrix[15] = 1;
-  
-  float m[16];
-
-  for(int i=0; i<16; i++)
-    {
-      m[i] = matrix[i];
-    }
-
-  if(stack)
-    {
-	matrix4x4(matrix, m, stack);
-    }
-
-}
-
-void rotate_x(float *xyz, float r)
-{
-  float rad = r*3.14/180;
-
-  xyz[0] = xyz[0];
-  xyz[1] = xyz[1]*cos(rad) - xyz[2]*sin(rad);
-  xyz[2] = xyz[1]*sin(rad) + xyz[2]*cos(rad);
-}
-
-void rotate_y(float *xyz, float r)
-{
-  float rad = r*3.14/180;
-
-  xyz[0] = xyz[0]*cos(rad) + xyz[2]*sin(rad);
-  xyz[1] = xyz[1];
-  xyz[2] = -xyz[0]*sin(rad) + xyz[2]*cos(rad);
-}
-
-void rotate_z(float *xyz, float r)
-{
-  float rad = r*3.14/180;
-
-  xyz[0] = xyz[0]*cos(rad) - xyz[1]*sin(rad);
-  xyz[1] = xyz[0]*sin(rad) + xyz[1]*cos(rad);
-  xyz[2] = xyz[2];
-}
-
-void rotate(float *xyz, float *matrix)
-{
-  float abc[4];
-  abc[0] = xyz[0];
-  abc[1] = xyz[1];
-  abc[2] = xyz[2];
-  abc[3] = xyz[3];
-
-  for(int i=0; i<4; i++)
-    {
-      //xyz[i] = abc[0]*rot[i] + abc[1]*rot[i+4] + abc[2]*rot[i+8] + abc[3]*rot[i+12];
-      xyz[i] = abc[0]*matrix[i] + abc[1]*matrix[i+4] + abc[2]*matrix[i+8] + abc[3]*matrix[i+12];
-    }
-}
-
-
-void translate(float *xyz, float x, float y, float z)
-{
-  xyz[0] += x;
-  xyz[1] += y;
-  xyz[2] += z;
-}
-
-/**                                                                                       
- *  ベクトルに行列を乗算する                                                              
- * @param[out] v vector (float[4])                                                        
- * @param[in] m matrix (float[16])                                                        
- */
-void
-ApplyMatrix(float *v, float *m)
-{
-  float t[4];
-
-  t[0] = v[0];
-  t[1] = v[1];
-  t[2] = v[2];
-  t[3] = v[3];
-
-  for (int i = 0; i < 4; i++) {
-    v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12];
-  }
-}
-
--- a/Renderer/Engine/sys.h	Fri Nov 05 22:43:25 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-#ifndef CR_SYS_H
-#define CR_SYS_H
-
-void noMoreMemory();
-void get_matrix(float *matrix, float *rxyz, float *txyz, float *stack);
-void rotate_x(float *xyz, float r);
-void rotate_y(float *xyz, float r);
-void rotate_z(float *xyz, float r);
-//void rotate(float *xyz, float *matrix, float *rxyz, float *txyz, float *stack[]);
-void rotate(float *xyz, float *matrix);
-void translate(float *xyz, float x, float y, float z);
-void matrix4x4(float *, float *, float *);
-
-void normalize(float *v0, float *v1);
-void subVector(float *v0, float *v1, float *v2);
-void outerProduct(float *v0, float *v1, float *v2);
-float innerProduct(float *v0, float *v1);
-void applyMatrix(float *v0, float *m, float *v1);
-void inversMatrix(float *m0, float *m1);
-void transposeMatrix(float *m0, float *m1);
-void unitMatrix(float *m);
-void transMatrix(float *m0, float *m1, float *v);
-void ApplyMatrix(float *v1, float *v2);
-
-#endif
--- a/Renderer/Engine/task/CreatePolygonFromSceneGraph.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/task/CreatePolygonFromSceneGraph.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -34,7 +34,7 @@
 	v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12];
     }
 }
-
+#if 0
 static void
 ApplyNormalMatrix(float *v, float *m)
 {
@@ -48,7 +48,7 @@
         v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8];
     }
 }
-
+#endif
 
 /**
  * 行列の積
@@ -186,9 +186,13 @@
 		//normal3[3] = 1.0f;
                 normal3[3] = 0.0f;
 
-                ApplyNormalMatrix(normal1,sg->real_matrix);
-                ApplyNormalMatrix(normal2,sg->real_matrix);
-                ApplyNormalMatrix(normal3,sg->real_matrix);
+                //ApplyNormalMatrix(normal1,sg->real_matrix);
+                //ApplyNormalMatrix(normal2,sg->real_matrix);
+                //ApplyNormalMatrix(normal3,sg->real_matrix);
+
+		ApplyMatrix(normal1,sg->real_matrix);
+		ApplyMatrix(normal2,sg->real_matrix);
+		ApplyMatrix(normal3,sg->real_matrix);
 
                 normal1[0] /= normal1[2];
                 normal1[1] /= normal1[2];
--- a/Renderer/Engine/task/CreateSpan.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/task/CreateSpan.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -153,6 +153,7 @@
     int base, tex_base;
     int scale = 1;
 
+    if (scale_max==0) return 1; // broken case
     /**
      * width と height で、長い方を基準に、
      * texture の scale を決める
--- a/Renderer/Engine/task/DrawSpan.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/task/DrawSpan.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -5,10 +5,10 @@
 #include "task_texture.h"
 #include "viewer_types.h"
 #include "Func.h"
-#include "sys.h"
 #include "SchedTask.h"
 #include "Tapestry.h"
 #include "SpanPack.h"
+#include "matrix_calc.h"
 
 #if (__LITTLE_ENDIAN__)
 #define LITTLEENDIAN 1
@@ -195,28 +195,23 @@
     int alpha = color & 0xff000000;
 #endif
 
-    //int *light_sysswitch = (int*)smanager->global_get(LightSysSwitch);
-
-
-    /*完全に透けているか判断, 法線ベクトルが奥を向いてるかどうか*/
-    int flag = (alpha != 0 && normal_z < 0);
-
-    //printf("light_sysswitch %d\n",light_sysswitch);
+    
+    //完全に透けているか判断
+    int flag = (alpha != 0);
+    int *light_sysswitch = (int*)smanager->global_get(LightSysSwitch);
+    //smanager->printf("sys %d\n",light_sysswitch);
 
-    //if ( *light_sysswitch == 1) {
-    if (flag) {
-           color = infinity_light_calc(color,normal_x,normal_y,normal_z,
-      				  smanager,localx,localy,zpos,
-      				  world_x,world_y,world_z);
+    if ( *light_sysswitch == 1 && flag) {
+        color = infinity_light_calc(color,normal_x,normal_y,normal_z,
+				    smanager,localx,localy,zpos,
+				    world_x,world_y,world_z);
     }
-      //}
 
     g->zRow[localx + (rangex*localy)] = zpos*flag + g->zRow[localx + (rangex*localy)]*(1-flag);
-    int *point = &g->linebuf[localy][localx] ;
+    int *point = &g->linebuf[localy][localx];
     *point =  color*flag + *point *(1-flag);
 
-
-
+    
 }
 
 /**
@@ -266,6 +261,7 @@
     tex_ypos = (int)((span->tex_height-1) * tey);
 
     if (zpos < g->zRow[localx + (rangex*localy)]) {
+	if (!span->tex_addr) return -1; // broken case, I'd like to write some thing...
         tex_addr = getTile(tex_xpos, tex_ypos,
                            span->tex_width, (memaddr)span->tex_addr);
         tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
@@ -373,6 +369,7 @@
             int tex_localx;
             int tex_localy;
 
+	    if (!span->tex_addr) continue; // broken case, I'd like to write some thing...
             tex_addr = getTile(tex_xpos, tex_ypos,
                                span->tex_width, (memaddr)span->tex_addr);
             tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
--- a/Renderer/Engine/task/create_sgp.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/task/create_sgp.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -98,8 +98,8 @@
 
 	    p->pn = nnpn;
 	    //node->tex_addr = t->texture_image->pixels;
-	    p->tex_width = t->texture_image->w;
-	    p->tex_height = t->texture_image->h;
+	    p->tex_width = t->texture_info.texture_image->w;
+	    p->tex_height = t->texture_info.texture_image->h;
 	    p = p->next;
 	} while (p);
     
--- a/Renderer/Engine/task/update_sgp.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/task/update_sgp.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -3,7 +3,7 @@
 #include <unistd.h>
 #include <math.h>
 #include "scene_graph_pack.h"
-#include "sys.h"
+#include "matrix_calc.h"
 #include "update_sgp.h"
 
 SchedDefineTask(Update_SGP);
@@ -16,6 +16,7 @@
     SceneGraphPack *_sgp = (SceneGraphPack*)s->get_output(wbuf, 0);
     //int screen_width = get_param(0);
     //int screen_height = get_param(1);
+    float scale[] = {1,1,1};
 
     // 本当はここでやるもんじゃないんだが。。。
     for (int i = 0; i < sgp->info.size && i < 3; i++) {
@@ -24,11 +25,11 @@
 	do {
 	    if (node->pn != -1) {
 		get_matrix(node->translation,
-			   node->angle, node->obj_pos,
+			   node->angle, node->obj_pos, scale,
 			   sgp->node[node->pn].translation);
 	    } else {
 		get_matrix(node->translation,
-			   node->angle, node->obj_pos,
+			   node->angle, node->obj_pos, scale,
 			   NULL);
 	    }
 
--- a/Renderer/Engine/texture.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/texture.h	Fri Dec 17 00:18:36 2010 +0900
@@ -17,7 +17,7 @@
     int scale_max;
     SDL_Surface *texture_image;
     GLuint gl_tex;
-    int pad[1]; // 12
+    int texture_id;
 
 } texture_list, *texture_list_ptr ; // 20 + pad(12) = 32
 
@@ -31,7 +31,7 @@
     int scale_max;
     void *texture_image;
     void *gl_tex;
-    int pad[1]; // 12
+    int texture_id;
 
 } texture_list, *texture_list_ptr ; // 20 + pad(12) = 32
 
--- a/Renderer/Engine/viewer.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -4,7 +4,7 @@
 #include "SceneGraph.h"
 #include "SceneGraphRoot.h"
 #include "scene_graph_pack.h"
-#include "sys.h"
+#include "matrix_calc.h"
 #include "Func.h"
 #include "error.h"
 #include "TaskManager.h"
@@ -142,6 +142,7 @@
     this_time  = 0;
     frames     = 0;
 
+    this->app = app;
     MainLoop *mainloop = app->init(this, this->width, this->height);
     mainloop->mainLoop();
 }
@@ -299,6 +300,7 @@
 void
 Viewer::run_loop(HTaskPtr task_next)
 {
+    task_next = app->application_task(task_next, this);
     dev->clear_screen();
 
     bool quit_flg;
@@ -312,16 +314,16 @@
     dev->clean_pixels();
 
     pixels = dev->flip_screen(pixels);
-
     sgroot->updateControllerState();
-
-    //TaskArray を使うか使わないか
-    if (sgroot->gtask_array != NULL) {
-	sgroot->create_task_array();
-	sgroot->allExecute(width, height);
-	sgroot->task_array_finish();
-    } else {
-	sgroot->allExecute(width, height);	
+    if (app->app_loop(this)) {
+	//TaskArray を使うか使わないか
+	if (sgroot->gtask_array != NULL) {
+	    sgroot->create_task_array();
+	    sgroot->allExecute(width, height);
+	    sgroot->task_array_finish();
+	} else {
+	    sgroot->allExecute(width, height);	
+	}
     }
 
     light_xyz_stock = sgroot->getLightVector();
@@ -434,161 +436,6 @@
 }
 
 
-// 完全にMac仕様。。sg_matrix を allocate してやらないといけないよ。
-float*
-copy_matrix(SceneGraphPtr sg, TaskManager *manager) {
-
-  float *matrix = sg->matrix;
-  float *real_matrix = sg->real_matrix;
-
-  //変換行列は4x4 なんで、16。が二つで32.と言い訳を書いてみる。
-  float *sg_matrix = (float*)manager->allocate(sizeof(float)*32);
-
-  for (int i = 0; i < 16; i++) {
-    sg_matrix[i] = matrix[i];
-    sg_matrix[i+16] = real_matrix[i];
-  }
-
-  return sg_matrix;
-
-}
-
-void
-print_matrix(float *matrix) {
-
-  for (int i = 0; i < 32; i++) {
-    printf("%f\n",matrix[i]);
-  }
-
-}
-
-void
-add_matrix_list(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) {
-
-    MatrixList *matrix_list = (MatrixList*)manager->allocate(sizeof(MatrixList));
-
-#if SPE_CREATE_POLYGON_CHECK
-    print_matrix(sg->sg_matrix);
-#endif    
-
-    matrix_list->matrix = copy_matrix(sg, manager);;
-    matrix_list->next = NULL;
-
-    
-    if (info->last != NULL) {
-        info->last->next = matrix_list;
-    }
-
-    info->last = matrix_list;
-    info->list_length += 1;
-
-}
-
-void
-new_matrix_info(SceneGraphPtr sg, TaskManager *manager, MatrixListInfo* info) {
-
-    MatrixListInfo *next = NULL;
-
-  if (info->id == -1) {
-
-    info->id = sg->sgid;
-    info->list_length = 1;
-    info->coord_pack = sg->coord_pack;
-    info->coord_pack_size = sg->coord_pack_size;
-    next = info;
-
-  } else {
-
-    MatrixListInfo* t;
-
-    for (t = info; t->next != NULL; t = t->next) {
-    }
-
-    next = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo));
-    next->id = sg->sgid;
-    next->list_length = 1;
-    next->coord_pack = sg->coord_pack;
-    next->coord_pack_size = sg->coord_pack_size;
-    next->next = NULL;
-    t->next = next;
-
-  }
-
-    MatrixList *new_list = (MatrixList*)manager->allocate(sizeof(MatrixList));
-    new_list->matrix = copy_matrix(sg, manager);
-
-#if SPE_CREATE_POLYGON_CHECK
-    print_matrix(sg->sg_matrix);
-#endif
-
-    new_list->next = NULL;
-
-    next->first = new_list;
-    next->last = new_list;
-
-}
-
-void
-collect_matrix(SceneGraphPtr sg, MatrixListInfo *matrix_info, TaskManager *manager) {
-  
-  matrix_info->id = -1;
-  matrix_info->list_length = 0;
-  matrix_info->next = NULL;
-  matrix_info->first = NULL;
-  matrix_info->last = NULL;
-
-  while (sg) {
-    
-    if (sg->flag_drawable) {
-      
-      int flag = 0;
-      
-      for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) {
-	if (sg->sgid == t->id) {
-	  add_matrix_list(sg, manager, t);
-	  flag = 1;
-	}	    	    	    
-      }
-      
-      if (flag != 1) {
-	new_matrix_info(sg, manager, matrix_info);  
-      }
-      
-      // search SceneGraph. でも、ただのリストがあったハズだから、あとでそれに直す。はず・・
-      if (sg->children != NULL) {
-	  sg = sg->children;
-      } else if (sg->brother != NULL) {
-	sg = sg->brother;
-      } else {
-	while (sg) {
-	  if (sg->brother != NULL) {
-	    sg = sg->brother;
-	      break;
-	  } else {
-	    if (sg->parent == NULL) {
-	      sg = NULL;
-	      break;
-	    } else {
-	      sg = sg->parent;
-	    }
-	  }
-	}
-      } 
-    } 
-  }
-}
-
-void
-check_matrix(MatrixListInfo *matrix_info,SceneGraphPtr sg) {
-
-  for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) {
-    for (MatrixList* u = t->first; u != NULL; u = u->next) {
-      print_matrix(u->matrix);
-    }
-  }
-
-}
-
 
 void
 coord_allocate(int &cur_point, float *coord_pack, int spe_num,
@@ -627,12 +474,43 @@
 
 }
 
-void
-create_pp_task(SceneGraphPtr sg, TaskManager *manager, int spe_num, HTaskPtr task_next)
+/* flag_drawable な Scenegraph の総数を求める */
+int
+sg_drawable_num(SceneGraphPtr scenegraph)
 {
+  SceneGraphPtr sg = scenegraph;
 
-  MatrixListInfo *matrix_info = (MatrixListInfo*)manager->allocate(sizeof(MatrixListInfo));
-  collect_matrix(sg, matrix_info, manager);
+  int sg_count = 0;
+  while (sg) {
+    if (sg->flag_drawable) {
+      sg_count++;
+    }
+    if (sg->children != NULL) {
+      sg = sg->children;
+    } else if (sg->brother != NULL) {
+      sg = sg->brother;
+    } else {
+      while (sg) {
+	if (sg->brother != NULL) {
+	  sg = sg->brother;
+	  break;
+	} else {
+	  if (sg->parent == NULL) {
+	    sg = NULL;
+	    break;
+	  } else {
+	    sg = sg->parent;
+	  }
+	}
+      }
+    }  
+  }
+  return sg_count;
+}
+
+void
+create_pp_task(SceneGraphPtr sg, TaskManager *manager, int spe_num, HTaskPtr task_next, SceneGraphRootPtr sgroot)
+{
 
   /*
    * SceneGraph を辿って coord_xyz, coord_tex, normal, matrix, real_matrix 及び、
@@ -640,46 +518,78 @@
    * 
    */
 
-  //HTaskPtr phase_wait = manager->create_task(Dummy);
-
-  for (MatrixListInfo* t = matrix_info; t != NULL; t = t->next) {
+  int sg_num = sg_drawable_num(sg);
+  int sg_division = sg_num / spe_num;
+  int residue = sg_num % spe_num;
 
-    printf("list_length %d \n", t->list_length);
+  HTask **task_array = (HTask**)manager->allocate(sizeof(HTask*)*spe_num);
+  Task **pptask = (Task**)manager->allocate(sizeof(Task*)*spe_num);
+  
+  for (int k = 0; k < spe_num-1; k++) {
+    task_array[k] = manager->create_task_array(CreatePolygonFromSceneGraph,sg_division,4,6,1);
+    pptask[k] = 0;
+  }
+  
+  task_array[spe_num] = manager->create_task_array(CreatePolygonFromSceneGraph,
+						   sg_division+residue,4,6,1);
+  pptask[spe_num] = 0;
 
-    int alloc_size = 16*1024;
+  int k = 0;
 
-    if (t->coord_pack_size < alloc_size) {
-      alloc_size = t->coord_pack_size;
-    }
-
+  while (sg) {
+    if (sg->flag_drawable) {
+      if(k < spe_num * sg_division) {
+	k %= spe_num-1;
+      } else {
+	k = spe_num;
+      }
+      pptask[k] = task_array[k]->next_task_array(CreatePolygonFromSceneGraph,pptask[k]);
 
-    int division_num = (t->coord_pack_size + alloc_size - 1) / alloc_size;
-    int phase_num = (division_num + spe_num -1) / spe_num;
-    int cur_point = 0;
+      pptask[k]->set_inData(0, &sg->coord_xyz, sizeof(float)*sg->size);
+      pptask[k]->set_inData(1, &sg->coord_tex, sizeof(float)*sg->size);
+      pptask[k]->set_inData(2, &sg->normal   , sizeof(float)*sg->size);
+      pptask[k]->set_inData(3, &sg->matrix   , sizeof(float)*16);
+      pptask[k]->set_inData(4, &sg->real_matrix, sizeof(float)*12);
+      pptask[k]->set_inData(5, &sg->texture_info.pixels, sizeof(uint32)); // 4 byte
 
-    for (int i = 0; i < phase_num; i++) {
+      // 4 byte * 4 = 16 byte
+      pptask[k]->set_param(0,(memaddr)sg->size); // 4byte
+      pptask[k]->set_param(1,(memaddr)sg->texture_info.t_w);
+      pptask[k]->set_param(2,(memaddr)sg->texture_info.t_h);
+      pptask[k]->set_param(3,(memaddr)sg->texture_info.scale_max);
       
-      HTaskPtr alloc_wait = manager->create_task(Dummy);
-      coord_allocate(cur_point, t->coord_pack, spe_num,
-		     alloc_size, alloc_wait, manager);
-
-
-      for (MatrixList* u = t->first; u != NULL; u = u->next) {
-
-	//HTaskPtr free_wait = manager->create_task(Dummy);
-	
-	//phase_wait = manager->create_task(Dummy);
-	
+    }
+    if (sg->children != NULL) {
+      sg = sg->children;
+    } else if (sg->brother != NULL) {
+      sg = sg->brother;
+    } else {
+      while (sg) {
+	if (sg->brother != NULL) {
+	  sg = sg->brother;
+	  break;
+	} else {
+	  if (sg->parent == NULL) {
+	    sg = NULL;
+	    break;
+	  } else {
+	    sg = sg->parent;
+	  }
+	}
       }
-
-      coord_free(spe_num, manager, alloc_wait);
-      alloc_wait->spawn();
     }
+    k++;
   }
-
-  printf("-----------------------\n");
-  //return create_pp_wait;
-
+  for (int k = 0; k < spe_num; k++) {
+    task_array[k]->spawn_task_array(pptask[k]->next());
+    task_array[k]->set_cpu(SPE_ANY);
+    task_array[k]->spawn();
+    if (sgroot->gtask_array != NULL) {
+      HTaskPtr game_task_array = sgroot->gtask_array->get_task_array();
+      task_array[k]->wait_for(game_task_array);
+    }
+    task_next->wait_for(task_array[k]);	
+  }
 }
 
 void
@@ -690,16 +600,15 @@
 
     SceneGraphPtr sg = sgroot->getDrawSceneGraph();
 
-    create_pp_task(sg, manager, spe_num, task_next);
+    create_pp_task(sg, manager, spe_num, task_next, sgroot);
 
 #if SPE_CREATE_POLYGON_CHECK
     check_matrix(matrix_info,sg);
 #endif
-
-
   
 #else
-    
+    //SceneGraphPtr sg = sgroot->getDrawSceneGraph();
+    //printf("sg->size = %lld\n", sizeof(pixels));
     HTaskPtr task_create_pp = manager->create_task(CreatePolygonFromSceneGraph);
     // SceneGraph(木構造) -> PolygonPack
 
@@ -724,6 +633,10 @@
         int index_start = range*i;
         int index_end = (index_start + range >= r[spi].spackList_length)
             ? r[spi].spackList_length : index_start + range;
+	int starty = index_start*split_screen_h + 1;
+        int endy = index_end*split_screen_h;
+	if (starty<=0) starty = 1;
+	if (endy>height) endy = height;
 
 	HTaskPtr task_create_sp = manager->create_task(CreateSpan);
 
@@ -739,8 +652,8 @@
          *   [649..864] [865..1080]
          */
 
-        task_create_sp->set_param(1,index_start*split_screen_h + 1);
-        task_create_sp->set_param(2,index_end*split_screen_h);
+        task_create_sp->set_param(1,starty);
+        task_create_sp->set_param(2,endy);
 
         task_create_sp->add_inData(r[ppi].ppack, sizeof(PolygonPack));
         task_create_sp->add_inData(r[spi].spackList_ptr,
--- a/Renderer/Engine/viewer.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/viewer.h	Fri Dec 17 00:18:36 2010 +0900
@@ -16,6 +16,27 @@
 
 class Application;
 
+typedef struct sg_pp {
+  //13088
+    float *coord_xyz; // (361*3) * 4
+    float *coord_tex;
+    float *normal; 
+
+  //8 * 16 
+    float *matrix; // 4 * 16
+    float *real_matrix; // 4 * 12
+    uint32 pixels; // addr
+
+    int sg_size; // 4
+    int width; // 4
+    int height; // 4
+    int scale_max; // 4
+
+    int length; // 4
+    int start;  // 4
+
+} SceneGraph2PolygonPack ;
+
 typedef struct rendering_data {
     PolygonPack *ppack;
     SpanPackPtr spackList;
@@ -108,21 +129,13 @@
     {
       sgroot->task_array_init(id, task_num, param, inData_num, outData_num);
     }
-    void set_game_task(int id, void *property, int size, PostFunction post_func)
+    void set_move_task(SceneGraphPtr node, int move, void *titlep, int size)
     {
-      sgroot->set_game_task(id, property, size, post_func);
-    }
-    void set_game_task(int id, void *property, void *pad, int size, PostFunction post_func)
-    {
-      sgroot->set_game_task(id, property, pad, size, post_func);
+      sgroot->set_move_task(node, move, titlep, size);
     }
-    void set_move_task(SceneGraphPtr node, int move, void *titlep, int size, PostFunction post_func)
+    void set_pad_task(SceneGraphPtr node, int move, void *property, int size)
     {
-      sgroot->set_move_task(node, move, titlep, size, post_func);
-    }
-    void set_pad_task(SceneGraphPtr node, int move, void *property, int size, PostFunction post_func)
-    {
-      sgroot->set_pad_task(node, move, property, size, post_func);
+      sgroot->set_pad_task(node, move, property, size);
     }
 
     void createFromXMLmemory(SceneGraph * node, char *data, int len)
--- a/Renderer/Engine/viewerGL.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/viewerGL.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -15,7 +15,7 @@
       v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8] + t[3]*m[i+12];
     }
 }
-
+#if 0
 static void
 ApplyNormalMatrix(float *v, float *m)
 {
@@ -29,6 +29,7 @@
       v[i] = t[0]*m[i] + t[1]*m[i+4] + t[2]*m[i+8];
     }
 }
+#endif
 
 ViewerGL::ViewerGL(TaskManager *m, int b, int w, int h, int _num)
 {
@@ -127,7 +128,8 @@
     glLoadIdentity( );
     
     //正射影
-    glOrtho( 0.0, width, height, 0.0, OPENGL_PARAM::near, OPENGL_PARAM::far );
+    //glOrtho( 0.0, width, height, 0.0, OPENGL_PARAM::near, OPENGL_PARAM::far );
+    glOrtho( 0.0, width, height, 0.0, OPENGL_PARAM::far, OPENGL_PARAM::near );
     
     glMatrixMode( GL_MODELVIEW );
     glLoadIdentity( );
@@ -145,7 +147,7 @@
     glEnable(GL_ALPHA_TEST);
     glAlphaFunc(GL_GREATER, 0);
     glDepthFunc(GL_LESS);
-    glShadeModel(GL_SMOOTH);
+    //glShadeModel(GL_SMOOTH);
 }
 
 void
@@ -210,16 +212,19 @@
 	  xyz1[0] = sg->coord_xyz[(i+0)*3];
 	  xyz1[1] = sg->coord_xyz[(i+0)*3+1];
 	  xyz1[2] = sg->coord_xyz[(i+0)*3+2]*-1.0f;
+	  //xyz1[2] = sg->coord_xyz[(i+0)*3+2];
 	  xyz1[3] = 1.0f;
 	  
 	  xyz2[0] = sg->coord_xyz[(i+1)*3];
 	  xyz2[1] = sg->coord_xyz[(i+1)*3+1];
 	  xyz2[2] = sg->coord_xyz[(i+1)*3+2]*-1.0f;
+	  //xyz2[2] = sg->coord_xyz[(i+1)*3+2];
 	  xyz2[3] = 1.0f;
 	  
 	  xyz3[0] = sg->coord_xyz[(i+2)*3];
 	  xyz3[1] = sg->coord_xyz[(i+2)*3+1];
 	  xyz3[2] = sg->coord_xyz[(i+2)*3+2]*-1.0f;
+	  //xyz3[2] = sg->coord_xyz[(i+2)*3+2];
 	  xyz3[3] = 1.0f;
 	  
 	  // sg->matrix = 回転行列*透視変換行列
@@ -227,47 +232,42 @@
 	  ApplyMatrix(xyz2, sg->matrix);
 	  ApplyMatrix(xyz3, sg->matrix);
 	  
+	  
 	  xyz1[0] /= xyz1[2];
 	  xyz1[1] /= xyz1[2];
 	  xyz2[0] /= xyz2[2];
 	  xyz2[1] /= xyz2[2];
 	  xyz3[0] /= xyz3[2];
 	  xyz3[1] /= xyz3[2];
-	  
+	  	  
 	  tex_xy1[0] = sg->coord_tex[(i+0)*3];
 	  tex_xy1[1] = sg->coord_tex[(i+0)*3+1];
 	  tex_xy2[0] = sg->coord_tex[(i+1)*3];
 	  tex_xy2[1] = sg->coord_tex[(i+1)*3+1];
 	  tex_xy3[0] = sg->coord_tex[(i+2)*3];
 	  tex_xy3[1] = sg->coord_tex[(i+2)*3+1];
-	  
+
 	  normal1[0] = sg->normal[(i+0)*3];
 	  normal1[1] = sg->normal[(i+0)*3+1];
 	  normal1[2] = sg->normal[(i+0)*3+2]*-1.0f;
+	  //normal1[2] = sg->normal[(i+0)*3+2];
 	  normal1[3] = 0.0f;
 	  
 	  normal2[0] = sg->normal[(i+1)*3];
 	  normal2[1] = sg->normal[(i+1)*3+1];
 	  normal2[2] = sg->normal[(i+1)*3+2]*-1.0f;
+	  //normal2[2] = sg->normal[(i+1)*3+2];
 	  normal2[3] = 0.0f;
 	  
 	  normal3[0] = sg->normal[(i+2)*3];
 	  normal3[1] = sg->normal[(i+2)*3+1];
 	  normal3[2] = sg->normal[(i+2)*3+2]*-1.0f;
+	  //normal3[2] = sg->normal[(i+2)*3+2];
 	  normal3[3] = 0.0f;
 	  
-	  ApplyNormalMatrix(normal1,sg->real_matrix);
-	  ApplyNormalMatrix(normal2,sg->real_matrix);
-	  ApplyNormalMatrix(normal3,sg->real_matrix);
-	  
-	  normal1[0] /= normal1[2];
-	  normal1[1] /= normal1[2];
-	  
-	  normal2[0] /= normal2[2];
-	  normal2[1] /= normal2[2];
-	  
-	  normal3[0] /= normal3[2];
-	  normal3[1] /= normal3[2];
+	  ApplyMatrix(normal1,sg->real_matrix);
+	  ApplyMatrix(normal2,sg->real_matrix);
+	  ApplyMatrix(normal3,sg->real_matrix);
 	  
 	  obj_draw(xyz1, tex_xy1, normal1);
 	  obj_draw(xyz2, tex_xy2, normal2);
@@ -302,6 +302,8 @@
 void
 ViewerGL::obj_draw(float *xyz, float *tex_xyz, float *normal_xyz)
 {  
+
+
     glTexCoord2f(tex_xyz[0], tex_xyz[1]);
     glVertex3f(xyz[0], xyz[1], xyz[2]);
     glNormal3f(normal_xyz[0], normal_xyz[1], normal_xyz[2]);
--- a/Renderer/Engine/xml.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Engine/xml.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -26,7 +26,7 @@
   cont = skip_to_number(cont);
   if (cont == NULL) return(NULL);
 
-  for (;*cont != ' ' && *cont != '\n' && *cont != '\t';cont++)
+  for (;*cont != ' ' && *cont != '\n' && *cont != '\t' && *cont != ',' ;cont++)
     {
       if (*cont == '-')
         {
--- a/Renderer/Test/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Test/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -14,7 +14,7 @@
 %.pb.cc: $(PROTODIR)/%.proto
 	$(PROTO) $(PROTOFLAGS) $<
 
-ALL = spe-main ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum dynamic viewer SgRootChange property_test create_task property_universe chain_old property_chain aquarium network init_aquarium 
+ALL = spe-main ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum dynamic viewer SgRootChange property_test create_task property_universe chain_old property_chain aquarium network init_aquarium
 
 all: $(ALL)
 
--- a/Renderer/Test/Makefile.def	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Test/Makefile.def	Fri Dec 17 00:18:36 2010 +0900
@@ -1,10 +1,10 @@
 
 CERIUM = ../..
 
-ABIBIT = 32
+ABIBIT = 64
 ABI =  -m$(ABIBIT)
 CC      = g++
-CFLAGS  = -g -Wall $(ABI) -O9   # -O -DDEBUG
+CFLAGS  = -g -Wall $(ABI) # -O9   # -O -DDEBUG
 
 INCLUDE = -I$(CERIUM)/include/TaskManager -I$(CERIUM)/Renderer/Engine -I. -I$(CERIUM)/include/Cerium
 LIBS = -L$(CERIUM)/TaskManager -L$(CERIUM)/Renderer/Engine $(ABI)
--- a/Renderer/Test/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Test/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -13,7 +13,7 @@
 %.pb.cc: $(PROTODIR)/%.proto
 	$(PROTO) $(PROTOFLAGS) $<
 
-ALL =  ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum property_test send_linda dynamic writer chain_old SgRootChange viewer aquarium network init_aquarium test_linda
+ALL =  ball_bound boss1_action direction gaplant ieshoot node panel universe untitled vacuum property_test send_linda dynamic writer chain_old SgRootChange viewer aquarium network init_aquarium test_linda 
 
 oFLAGS=-g -O2
 CFLAGt=-g -O2
@@ -103,6 +103,7 @@
 test_linda : $(TEST_LINDA_OBJ)
 	$(CC) -o $@ $? $(LIBS) $(PROTOLIBS)
 
+
 run: $(TARGET)
 	sudo ./$(TARGET) -width 576 -height 384 -bpp 32
 
--- a/Renderer/Test/ball_bound.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Test/ball_bound.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -81,8 +81,8 @@
 static void
 ball_move(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h)
 {
-    vy += g * dt;
-    node->xyz[1] += vy * dt;
+  vy += g * dt;
+   node->xyz[1] += vy * dt;
     //    node->xyz[0] += 10.0f;
 }
 
@@ -95,15 +95,15 @@
 ball_collision(SceneGraphPtr node, void *sgroot_, int screen_w, int screen_h,
 			   SceneGraphPtr tree)
 {
-    if (node->xyz[1] > screen_h - ball_radius) {
-		node->xyz[1] = screen_h - ball_radius;
-
-		vy *= e;
-		if (vy > -g && vy < 0) {
-			vy = 0.0;
-			node->set_move_collision(ball_move_idle, ball_collision_idle);
-		}
-    }
+  if (node->xyz[1] > screen_h - ball_radius) {
+  		node->xyz[1] = screen_h - ball_radius;
+  
+  		vy *= e;
+  		if (vy > -g && vy < 0) {
+  			vy = 0.0;
+  			node->set_move_collision(ball_move_idle, ball_collision_idle);
+  		}
+  }
 }
 
 MainLoopPtr 
--- a/Renderer/Test/create_task.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Test/create_task.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -4,8 +4,8 @@
 #include "MainLoop.h"
 #include "create_task.h"
 #include "types.h"
-#include "Func.h"
-#include "sys.h"
+#include "MyFunc.h"
+#include "matrix_calc.h"
 #include "SgChange.h"
 
 Property *property, *update_property;
@@ -58,9 +58,11 @@
     node->xyz[1] = update_property->xyz[1];
     node->xyz[2] = update_property->xyz[2];
 
+    float scale[] = {1,1,1};
+
     // get matrix
-    get_matrix(node->matrix, node->angle, node->xyz, sgroot->camera->matrix);
-    get_matrix(node->real_matrix, node->angle, node->xyz, sgroot->camera->real_matrix);
+    get_matrix(node->matrix, node->angle, node->xyz, scale, sgroot->camera->matrix);
+    get_matrix(node->real_matrix, node->angle, node->xyz, scale, sgroot->camera->real_matrix);
 
     sgroot->setSceneData(node);
 
--- a/Renderer/Test/property_chain.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Test/property_chain.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -4,8 +4,8 @@
 #include "MainLoop.h"
 #include "property_chain.h"
 #include "types.h"
-#include "Func.h"
-#include "sys.h"
+#include "MyFunc.h"
+#include "matrix_calc.h"
 #include "SgChange.h"
 
 #define FALSE 0
@@ -101,14 +101,15 @@
     for (int j = 0; j < PROPERTY_LENGTH; j++) {
 	p = &update_property[j];
 	p_node = (SceneGraphPtr)p->node;
+	float scale[] = {1,1,1};
 	if (p->have_parent) {
 	    SceneGraphPtr parent = (SceneGraphPtr)update_property[p->parent_index].node;
 	    parent->addChild(p_node);
-	    get_matrix(p_node->matrix, p_node->angle, p_node->xyz, parent->matrix);
-	    get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, parent->real_matrix);
+	    get_matrix(p_node->matrix, p_node->angle, p_node->xyz, scale, parent->matrix);
+	    get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, scale, parent->real_matrix);
 	} else {
-	    get_matrix(p_node->matrix, p_node->angle, p_node->xyz, camera->matrix);
-	    get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, camera->real_matrix);
+	  get_matrix(p_node->matrix, p_node->angle, p_node->xyz, scale, camera->matrix);
+	  get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, scale, camera->real_matrix);
 	}
     }
 
--- a/Renderer/Test/property_universe.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/Renderer/Test/property_universe.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -4,8 +4,8 @@
 #include "MainLoop.h"
 #include "property_universe.h"
 #include "types.h"
-#include "Func.h"
-#include "sys.h"
+#include "MyFunc.h"
+#include "matrix_calc.h"
 #include "SgChange.h"
 
 static const int PROPERTY_LENGTH = 2;
@@ -62,14 +62,15 @@
     for (int j = 0; j < PROPERTY_LENGTH; j++) {
 	p = &update_property[j];
 	p_node = (SceneGraphPtr)p->node;
+	float scale[] = {1,1,1};
 	if (p->have_parent) {
 	    SceneGraphPtr parent = (SceneGraphPtr)update_property[p->parent_index].node;
 	    parent->addChild(p_node);
-	    get_matrix(p_node->matrix, p_node->angle, p_node->xyz, parent->matrix);
-	    get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, parent->real_matrix);
+	    get_matrix(p_node->matrix, p_node->angle, p_node->xyz, scale, parent->matrix);
+	    get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, scale, parent->real_matrix);
 	} else {
-	    get_matrix(p_node->matrix, p_node->angle, p_node->xyz, camera->matrix);
-	    get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, camera->real_matrix);
+	  get_matrix(p_node->matrix, p_node->angle, p_node->xyz, scale, camera->matrix);
+	  get_matrix(p_node->real_matrix, p_node->angle, p_node->xyz, scale, camera->real_matrix);
 	}
     }
 
--- a/SceneGraph/BlenderScript/export_xml.py	Fri Nov 05 22:43:25 2010 +0900
+++ b/SceneGraph/BlenderScript/export_xml.py	Fri Dec 17 00:18:36 2010 +0900
@@ -1,6 +1,6 @@
 #!BPY
 """Registration info for Blender menus:
-Name: 'Libps3 (.xml)'
+Name: 'Libps+x (.xml)'
 Blender: 240
 Group: 'Export'
 Tooltip: 'Export to (.xml) for libps3'
@@ -144,7 +144,7 @@
 		#str = ""
 		file.write("")
 		matrix = obj.getMatrix()
-
+		big = 6
 		for mindex in range(len(flist)):
 			fl = flist[mindex]
 			if fl != []:
@@ -166,9 +166,9 @@
 					tri_second = vlist[f[1]]
 					tri_third = vlist[f[2]]
 
-					file.write("\t\t\t%f %f %f\n" %(tri_first[0][0] + matrix[3][0], tri_first[0][1] + matrix[3][1], tri_first[0][2] + matrix[3][2]) )
-					file.write("\t\t\t%f %f %f\n" %(tri_second[0][0] + matrix[3][0], tri_second[0][1] + matrix[3][1], tri_second[0][2] + matrix[3][2]) )
-					file.write("\t\t\t%f %f %f\n" %(tri_third[0][0] + matrix[3][0], tri_third[0][1] + matrix[3][1], tri_third[0][2] + matrix[3][2]) )
+					file.write("\t\t\t%f %f %f\n" %(big*(tri_first[0][0]  + matrix[3][0]), big*(tri_first[0][1]  + matrix[3][1]), big*(tri_first[0][2]  + matrix[3][2])) )
+					file.write("\t\t\t%f %f %f\n" %(big*(tri_second[0][0] + matrix[3][0]), big*(tri_second[0][1] + matrix[3][1]), big*(tri_second[0][2] + matrix[3][2])) )
+					file.write("\t\t\t%f %f %f\n" %(big*(tri_third[0][0]  + matrix[3][0]), big*(tri_third[0][1]  + matrix[3][1]), big*(tri_third[0][2]  + matrix[3][2])) )
 				file.write("\t\t</coordinate>\n")
 
 				file.write("\t\t<normal>\n")
@@ -177,9 +177,9 @@
 					tri_second = vlist[f[1]]
 					tri_third = vlist[f[2]]
 
-					file.write("\t\t\t%f %f %f\n" %(tri_first[1][0], tri_first[1][1], tri_first[1][2]) )
-					file.write("\t\t\t%f %f %f\n" %(tri_second[1][0], tri_second[1][1], tri_second[1][2]) )
-					file.write("\t\t\t%f %f %f\n" %(tri_third[1][0], tri_third[1][1], tri_third[1][2]) )
+					file.write("\t\t\t%f %f %f\n" %(big*(tri_first[1][0]),  big*(tri_first[1][1]),  big*(tri_first[1][2])) )
+					file.write("\t\t\t%f %f %f\n" %(big*(tri_second[1][0]), big*(tri_second[1][1]), big*(tri_second[1][2])) )
+					file.write("\t\t\t%f %f %f\n" %(big*(tri_third[1][0]),  big*(tri_third[1][1]),  big*(tri_third[1][2])) )
 				file.write("\t\t</normal>\n" )
 
 				file.write("\t\t<model>\n" )
@@ -193,28 +193,26 @@
 						tri_first = vlist[f[0]]
 						tri_second = vlist[f[1]]
 						tri_third = vlist[f[2]]
-
-						file.write("\t\t\t%f %f\n" %(tri_first[2][0], tri_first[2][1]) )
-						file.write("\t\t\t%f %f\n" %(tri_second[2][0], tri_second[2][1]) )
-						file.write("\t\t\t%f %f\n" %(tri_third[2][0], tri_third[2][1]) )
+						file.write("\t\t\t%f %f\n" %(tri_first[2][0], (-1*(tri_first[2][1])+1 )))
+						file.write("\t\t\t%f %f\n" %(tri_second[2][0], (-1*(tri_second[2][1])+1 )))
+						file.write("\t\t\t%f %f\n" %(tri_third[2][0], (-1*(tri_third[2][1])+1 )))
 					file.write("\t\t</texture>\n")
 				else:
-					file.write("\t\t<texture/>\n")
-
-
+					file.write("\t\t<texture>\n")
+					for f in fl:
+						file.write("\t\t\t0.000000 0.000000\n")
+						file.write("\t\t\t0.000000 0.000000\n")
+						file.write("\t\t\t0.000000 0.000000\n")
+					file.write("\t\t</texture>\n")
 				### get texture_image and change base64 data
 				texture = mesh.faces[0].image
 				if texture:
-					file.write(loadTexture(texture))	
-					
+					file.write(loadTexture(texture))
 				else:
-					file.write("\t\t<image name=\"%s\">\n" %("sample_white.png") )
-
-					file.write("\t\t\tiVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAAAAADhZOFXAAAAEElEQVQImWP8zwABTAwUMQBJQQEP\n");
-					file.write("\t\t\tlYH+agAAAABJRU5ErkJggg==\n");
-
+					file.write("\t\t<image name=\"%s\">\n" %("dummy.png") )
+					file.write("\t\t\tiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGUlEQVQokWP8/fs3AymAiSTVoxpG\n");
+					file.write("\t\t\tNQwpDQAwxQMRlevqcQAAAABJRU5ErkJggg==\n");
 					file.write("\t\t</image>\n")
-
 		#return str
 
 	vdata = []
@@ -447,8 +445,8 @@
 def loadTexture(texture):
 	global images, imageCount
 	name = texture.getName()
-	if name in images:
-		return "\t\t<image name=\"" + name + "\"/>\n"	
+	#if name in images:
+	#	return "\t\t<image name=\"" + name + "\"/>\n"	
 	out = "\t\t<image name=\"" + name + "\">\n"
 	imageCount += 1
 	images[name] = imageCount
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SceneGraph/BlenderScript/script_copy.sh	Fri Dec 17 00:18:36 2010 +0900
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cp $1 /Applications/*blender*/blender.app/Contents/MacOS/.blender/scripts/
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -22,9 +22,10 @@
 }
 
 void
-CellTaskManagerImpl::init()
+CellTaskManagerImpl::init(int spuIdle_)
 {
     spe_running = 0;
+    spuIdle = spuIdle_;
 
     // 実行可能な HTask のリスト。 FifoTaskManager と共有される
     activeTaskQueue = new QueueInfo<HTask>(htaskPool);
@@ -107,13 +108,14 @@
 {
     for (int id = 0; id < machineNum; id++)  {
 	mail_check(id);
-	if (!speTaskList[id]->empty()) 
+	if (!speTaskList[id]->empty()) {
 	    continue; // まだ、走ってる
+	}
 	if (! taskListInfo[id]->empty() ) {
 	    // SPE に送る TaskList の準備
 	    send_taskList(id);
 	    spe_running++;
-	}
+	}	
     }
 }
 
@@ -125,9 +127,25 @@
     sendTaskList();
 }
 
+
+void
+CellTaskManagerImpl::debug_check_spe_idle(QueueInfo<HTask> * activeTaskQueue, int spe_running_)
+{
+	printf("spu_idle! spe_running = %d : activeTaskQueue->length = %d \n"
+		, spe_running_, activeTaskQueue->length());
+	HTask *task = activeTaskQueue->getFirst();
+	
+	do {
+		printf("task_name = %s ,",ppeManager->get_task_name(task));
+		printf("cpu = [%d]", task->cpu_type);
+	} while ((task = activeTaskQueue->getNext(task)) != 0);
+	printf("\n");
+}
+
 void
 CellTaskManagerImpl::run()
 {
+int spu_limit = spuIdle;
     do {
         // PPE side
 	ppeManager->poll();
@@ -135,11 +153,14 @@
 	do {
 	    poll();
 	} while (ppeManager->activeTaskQueue->empty() && spe_running >0 );
+	if (spe_running < spu_limit) {
+	  debug_check_spe_idle(ppeManager->activeTaskQueue, spe_running);
+	} 
     } while (!ppeManager->activeTaskQueue->empty() || 
-	!activeTaskQueue->empty() ||
-	spe_running >0); 
+	     !activeTaskQueue->empty() ||
+	     spe_running >0); 
     if (!waitTaskQueue->empty()) {
-	show_dead_lock_info();
+      show_dead_lock_info();
     }
 }
 
@@ -301,6 +322,12 @@
     }
 }
 
+void CellTaskManagerImpl::print_arch() 
+{
+    printf("CellTaskManager\n");
+}
+
+
 
 #ifdef __CERIUM_CELL__
 TaskManagerImpl*
--- a/TaskManager/Cell/CellTaskManagerImpl.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.h	Fri Dec 17 00:18:36 2010 +0900
@@ -18,10 +18,11 @@
     SpeThreads *speThreads;
     FifoTaskManagerImpl *ppeManager;
     int spe_running;
+    int spuIdle;
 
     /* functions */
     // system
-    void init();
+    void init(int spuIdle);
     void run();
     void poll();
     void mail_check(int id);
@@ -31,7 +32,8 @@
     void show_profile() ;
     void start_profile() ;
     void polling();
-
+    void debug_check_spe_idle(QueueInfo<HTask> * activeTaskQueue, int spe_running_);
+    void print_arch();
 private:
     void send_taskList(int id);
     void show_dead_lock_info();
--- a/TaskManager/Cell/spe/CellDmaManager.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Cell/spe/CellDmaManager.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -5,8 +5,6 @@
 
 
 unsigned long long alloc_flag = 0;
-// singleton
-QueueInfo<MailQueue> *MailPool = new QueueInfo<MailQueue>() ;
 
 /**
  * DMA Load
@@ -90,21 +88,22 @@
 void CellDmaManager::mail_write_queue(memaddr data)
 {
     (this->*start_dmawait_profile)();
+
     if (0 != spu_readchcnt(SPU_WrOutMbox)) {
-      if (mail_queue->empty()) {
+      if (mail_queue->count()) {
           spu_write_out_mbox((uint32)data);
       } else {
-	  MailQueuePtr mail = mail_queue->poll();
-	  spu_write_out_mbox((uint32)mail->data);
-	  mail_queue->free_(mail);
-	  mail = mail_queue->create();
-	  mail->data = data;
-	  mail_queue->addLast(mail);
+
+	//mail_queue から poll する
+	spu_write_out_mbox((uint32)mail_queue->recv());
+	//mail_queue に加える
+	mail_queue->send(data);
+
       }
     } else {
-        MailQueuePtr mail = mail_queue->create();
-	mail->data = data;
-	mail_queue->addLast(mail);
+
+      mail_queue->send(data);
+
     }
     (this->*end_dmawait_profile)(&global_mail_time);
 }
@@ -115,31 +114,55 @@
 
     (this->*start_dmawait_profile)();
 
-    while (!mail_queue->empty()) {
-      MailQueuePtr mail = mail_queue->poll();
-      spu_write_out_mbox((uint32)mail->data);      
-      mail_queue->free_(mail);
+    while (mail_queue->count()) {
+
+      spu_write_out_mbox((uint32)mail_queue->recv());      
+
     }
 
     spu_write_out_mbox((uint32)data);
-    //mail_queue.freePool();
 
     (this->*end_dmawait_profile)(&global_mail_time);
+
+
 }
 
 memaddr CellDmaManager::mail_read()
 {
+
+
     (this->*start_dmawait_profile)();
     memaddr data = (memaddr)spu_read_in_mbox();
+    
 #if 0 
     if (ABIBIT>32) {
 	data += (spu_read_in_mbox()<<32);
     }
 #endif
     (this->*end_dmawait_profile)(&global_mail_time);
+
+
+
     return data;
 }
 
+memaddr CellDmaManager::task_list_mail_read()
+{
+
+    unsigned long long wait = 0;
+
+    (this->*start_dmawait_profile)();
+    memaddr data = (memaddr)spu_read_in_mbox();
+    (this->*end_dmawait_profile)(&wait);
+
+    task_list_mail_time += wait;
+    global_mail_time += wait;
+
+    return data;
+}
+
+
+
 void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask)
 {
     mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length,
@@ -156,7 +179,7 @@
 CellDmaManager::CellDmaManager() 
 {
 
-    mail_queue = new QueueInfo<MailQueue>(MailPool);
+    mail_queue = new MailManager();
     stop_profile();
 }
 void
@@ -166,6 +189,7 @@
     global_mail_time = 0;
     global_wait_time = 0;
     task_array_load_time = 0;
+    task_list_mail_time = 0;
     start_dmawait_profile =  &CellDmaManager::do_start_dmawait_profile;
     end_dmawait_profile =  &CellDmaManager::do_end_dmawait_profile;  
 
@@ -186,8 +210,10 @@
 void
 CellDmaManager::do_start_dmawait_profile()
 {
+
     wait_time = spu_readch(SPU_RdDec); 
     global_busy_time += busy_time - wait_time;
+    //printf("busy_time = %d, wait_time = %d\n", busy_time, wait_time);
     spu_writech(SPU_WrDec, 0xffffffff);
 
     // Measurement of mainMem_alloc
@@ -199,6 +225,7 @@
 CellDmaManager::do_end_dmawait_profile(unsigned long long *counter)
 {
     wait_time = spu_readch(SPU_RdDec);
+    //printf("wait_time = %d", wait_time);
     *counter += 0xffffffff - wait_time;
     busy_time = wait_time;
 
@@ -225,14 +252,21 @@
 	global_busy_time+global_wait_time+global_mail_time
 	))*100.0;
 
+  double t = ((double)task_list_mail_time)/((double)(
+	global_busy_time+global_wait_time+global_mail_time
+	))*100.0;
+
+
   s->printf("spu%d: busy_time = %lld"
   " wait_time = %lld(%.3g%%), "
   " mail_time = %lld(%.3g%%), " 
-  " busy_ratio = %.3g%%"
-  " array_load_time = %lld\n"
+  " task_list_mail_time = %lld(%.3g%%), " 
+  " busy_ratio = %.3g%%, "
+  " array_load_time = %lld, "
   " mainMem_alloc_time = %lld\n"
     ,cpu, global_busy_time,
-    global_wait_time, d, global_mail_time, m, r,
+    global_wait_time, d, global_mail_time, m, 
+    task_list_mail_time, t, r,
     task_array_load_time,
     mainMemalloc_time);
 
@@ -240,6 +274,7 @@
     global_mail_time = 0;
     global_wait_time = 0;
     task_array_load_time = 0;
+    task_list_mail_time = 0;
     mainMemalloc_time = 0;
     alloc_flag = 0;
 }
--- a/TaskManager/Cell/spe/CellDmaManager.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Cell/spe/CellDmaManager.h	Fri Dec 17 00:18:36 2010 +0900
@@ -4,8 +4,7 @@
 #include "base.h"
 #include "types.h"
 #include "DmaManager.h"
-#include "QueueInfo.h"
-#include "MailQueue.h"
+#include "MailManager.h"
 
 #include <spu_mfcio.h>
 #include <spu_intrinsics.h>
@@ -23,7 +22,6 @@
 	uint32 size;
     }  __attribute__ ((aligned (DEFAULT_ALIGNMENT))) DmaList, *DmaListPtr;
 
-    QueueInfo<MailQueue> *mail_queue;
 
     CellDmaManager() ;
 
@@ -31,6 +29,7 @@
     unsigned int wait_time, busy_time, alloc_busy_time;
     unsigned long long global_busy_time, global_wait_time, global_mail_time, mainMemalloc_time;
     unsigned long long task_array_load_time;
+    unsigned long long task_list_mail_time;
 
     /* functions */
     void dma_load(void *buf, memaddr addr, uint32 size, uint32 mask);
@@ -49,6 +48,7 @@
     void mail_write_queue(memaddr data);
     void mail_write_finish_list(memaddr data);
     memaddr mail_read();
+    memaddr task_list_mail_read();
     void dma_loadList(ListDataPtr list, void *buff, uint32 mask);
     void dma_storeList(ListDataPtr, void *buff, uint32 mask);
 
@@ -59,6 +59,8 @@
     void null_start_dmawait_profile();
     void null_end_dmawait_profile(unsigned long long *counter);
 
+    MailManagerPtr mail_queue;
+
 
 /* end */
 }  ;
--- a/TaskManager/Cell/spe/MailQueue.h	Fri Nov 05 22:43:25 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-#ifndef INCLUDED_MAILQUEUE
-#define INCLUDED_MAILQUEUE
-
-class MailQueue {
-public:
-    memaddr data;
-    MailQueue *next; // 4 byte
-    MailQueue *prev; // 4 byte
-    MailQueue *waiter; // 4 byte
-
-    void init() { data = 0; }
-    void initOnce() {}
-    void freeOnce() {}
-
-} ;
-
-typedef MailQueue* MailQueuePtr;
-
-#endif
--- a/TaskManager/Cell/spe/SpeTaskManagerImpl.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -5,7 +5,7 @@
 SpeTaskManagerImpl::SpeTaskManagerImpl() {}
 SpeTaskManagerImpl::~SpeTaskManagerImpl() {}
 
-void SpeTaskManagerImpl::init() {}
+void SpeTaskManagerImpl::init(int spuIdle_) {}
 void SpeTaskManagerImpl::run() {}
 
 HTaskPtr SpeTaskManagerImpl::create_task(int cmd) {return 0;}
@@ -17,6 +17,8 @@
 void SpeTaskManagerImpl::show_profile() {}
 void SpeTaskManagerImpl::start_profile() {}
 
+void SpeTaskManagerImpl::print_arch() { printf("SpeTaskManagerImpl\n"); }
+
 // Odd
 
 TaskManagerImpl::TaskManagerImpl(int i) {}
--- a/TaskManager/Cell/spe/SpeTaskManagerImpl.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.h	Fri Dec 17 00:18:36 2010 +0900
@@ -15,7 +15,7 @@
 
     /* functions */
     // call by system
-    void init();
+    void init(int spuIdle);
     void run();
     void start_profile();
     void show_profile();
@@ -27,6 +27,7 @@
     void set_task_cpu(HTaskPtr, CPU_TYPE);
     void polling() {}
     void free_htask(HTaskPtr htask) {}
+    void print_arch();
 
 }  ;
 
--- a/TaskManager/ChangeLog	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/ChangeLog	Fri Dec 17 00:18:36 2010 +0900
@@ -1,536 +1,578 @@
+2010-12-10 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
+
+	task_list を PPE の main memory において、それを get_segment で取って来る。
+	実行する object は、PPE 側の main memory 上に置く。それを get_segment で
+	copy して実行する。
+
+	taskのindata/outdata/get_segment を実際にはコピーしないようにすると良いのだが...
+	そうすれば、実行時のアドレスが変わらないのでデバッグが容易。
+	そういうオプション? いや、get_segment をそういうようにする?
+
+	task_list 上に固定アドレス task かどうかの選択を入れれば良いのか。
+
+	とりあえず、task_list を get_segment するところから書くのが良さそう。
+
+	task_list のaddress を SPE にどうやって教えるかと言う問題がある。
+	mail かな。
+
+	tag 使う? argv で渡すってあり?  envp で送れるのではないか?
+	envp はダメだが、argv では渡せるらしい。
+
+	まず、ppe と spe の task_list を作る API の設計と実装をするべきらしい。
+
+	Task 側のは無視 (おぉ?!) SPE 側の SchedRegister も不要。
+
+	get_segment だけでできる?
+
+	PPE側で、
+
+	       TaskRegister(Task ID, 0 file, entry symbol);           // PPE fixed task
+	       SpeTaskRegister(Task ID, object file, entry symbol);   // SPE dynamic task
+	       SpeTaskRegister(Task ID, 0, entry symbol);             // SPE fixed task
+
+	を指定することになる。 PPE 側は自動的に登録される ( -cpu 0 があるから )
+	task_list と spu_task_list が同時に初期化される
+
+	object file は、.a でも良い。(良いの?)  embed しても良い。
+
+	と言うことは、今までのように run を使い回しっ手のいうは許されないってこと?
+	その方が良いでしょう。変更大きいけど。
+
+	SPE側に固定する Task はどうするの?
+
 2010-8-7 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   get_segmentのinlineは、その場に static に置いて、default のものを置いておく。
-   size のcheckはしない。
-
-   MemList は廃止。QueueInfo に。
-
-   Data 領域は、2^n 管理で、move/compaction を行なう。(が、今は書かない)
-
-   とりあえず、SPUのobject管理だが...
+	get_segmentのinlineは、その場に static に置いて、default のものを置いておく。
+	size のcheckはしない。
+
+	MemList は廃止。QueueInfo に。
+
+	Data 領域は、2^n 管理で、move/compaction を行なう。(が、今は書かない)
+
+	とりあえず、SPUのobject管理だが...
 
 2010-8-6 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   Bulk, Simple, basic は一つにするべきだよな。many_task は、sort と言う名前に変えるべき。
+	Bulk, Simple, basic は一つにするべきだよな。many_task は、sort と言う名前に変えるべき。
 
 2010-7-31 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   なんと、simple task を SchedTaskManager 経由で作ると、
-   PPE task しか作れなくなっていたらしい。それな遅いよ。
-   SchedTaskManagerのtask managerがFifoManagerだったのが
-   原因。CellTaskManager を使う時には、FifoManagerは消せる?
-
-   その代わり、dead lock が起きる。待ち先のtaskが消滅する場合が
-   あるらしい。
-
-   やっぱり、既に終了した task に対して wait for してしまうのが
-   まずいらしい。自分で HTask をfree してやれば良いわけだが..
+	なんと、simple task を SchedTaskManager 経由で作ると、
+	PPE task しか作れなくなっていたらしい。それは遅いよ。
+	SchedTaskManagerのtask managerがFifoManagerだったのが
+	原因。CellTaskManager を使う時には、FifoManagerは消せる?
+
+	その代わり、dead lock が起きる。待ち先のtaskが消滅する場合が
+	あるらしい。
+
+	やっぱり、既に終了した task に対して wait for してしまうのが
+	まずいらしい。自分で HTask をfree してやれば良いわけだが..
 
 2010-7-30 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   TASK_LIST_MAIL でない方が高速なみたい
-   sort (many_task) が、とっても遅くなっている
+	TASK_LIST_MAIL でない方が高速なみたい
+	sort (many_task) が、とっても遅くなっている
 
 2010-7-24 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   やっぱり、load module のlinkの解決はやらないといけないので、
-   無理に、SchedTaskのAPI全部を virtual にする必要はないらしい。
-      spu-gcc  spe/ChainCal.o -Wl,-R,spe-main -o tmp.o
-   と言う形で、link してやれば良い。(ただし、必要なものが参照されている場合)
+	やっぱり、load module のlinkの解決はやらないといけないので、
+	無理に、SchedTaskのAPI全部を virtual にする必要はないらしい。
+	spu-gcc  spe/ChainCal.o -Wl,-R,spe-main -o tmp.o
+	と言う形で、link してやれば良い。(ただし、必要なものが参照されている場合)
 
 2010-7-16 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   SimpleTask のsizeを16の倍数に。そうしないと、Taskのaligmentが16に
-   ならないので、gcc -O9 で破綻する。
+	SimpleTask のsizeを16の倍数に。そうしないと、Taskのaligmentが16に
+	ならないので、gcc -O9 で破綻する。
 
 2010-7-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   SchedTaskArray::exec の run の値が最適化で、おかしくなるのは、gcc のbugらしい。
-   SimpleTask の finish mail が返るのが早すぎる。write を呼ぶのが正しい。
-   cur_index++ してしまうと、task1/task2 のcur_indexが同じになってしまう。
+	SchedTaskArray::exec の run の値が最適化で、おかしくなるのは、gcc のbugらしい。
+	SimpleTask の finish mail が返るのが早すぎる。write を呼ぶのが正しい。
+	cur_index++ してしまうと、task1/task2 のcur_indexが同じになってしまう。
 
 2010-5-25 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう
-    のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、
-    check_task_list_finishとかが再帰的に呼びされるのがやっかい。
-
-    Task 実行ループは Scheduler にpoling routineを登録するのが良さそう。
-    post_func は、SchedTask 経由で poling すれば良い。
+	PPE側のpost_funcやtaskを実行している時にもSPEからのメールは読んでしまう
+	のが望ましい。読んで、とりあえずfifoに入れておく。その場で処理しても良いが、
+	check_task_list_finishとかが再帰的に呼びされるのがやっかい。
+
+	Task 実行ループは Scheduler にpoling routineを登録するのが良さそう。
+	post_func は、SchedTask 経由で poling すれば良い。
 
 2010-5-22 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。
-    CpuManager みたいなものを用意しないとダメか。
-
-    HTask から、waitfor/create_task とかは、TaskManager を呼んでいる。
-    そのたびに CAS (Check and set) するのはばかげているよな〜
-    TaskManager にメールで送る方が良いのではないか。
-
-    wait_for する Task が既に終了していると、存在しないTaskあるいは、
-    別な Task を wait_for する場合がある。いわゆるゾンビだけど、これは
-    どうしよう? 生きているかどうかを識別するように id を付けるか?
-
-    どうも、TaskManager.{h,cc} は要らないっぽい。TMmain に渡されるのも
-    SchedTask である方が自然。
-
-    TaskListInfo は循環リストなので、SPU/PPU scheduler に渡す前に、
-    getLast()->next = 0 する必要がある。freeAll() する前に、直さないと
-    だめ。getList() みたいなものを用意しても良いが...
-
-    Scheduler のconnector(DMA) / Memory 関連は Scheduler.{h,cc} から
-    追い出すべき。connector/memory とかを SchedTask に持たせれば良い。
-    そうすると、API追加でScheduelr.{h,cc} / TaskManagerImple とかを修正する
-    必要がなくなる。
+	CpuThread を作るなら、create_task は、manager にメールで教えないとだめ。
+	CpuManager みたいなものを用意しないとダメか。
+
+	HTask から、waitfor/create_task とかは、TaskManager を呼んでいる。
+	そのたびに CAS (Check and set) するのはばかげているよな〜
+	TaskManager にメールで送る方が良いのではないか。
+
+	wait_for する Task が既に終了していると、存在しないTaskあるいは、
+	別な Task を wait_for する場合がある。いわゆるゾンビだけど、これは
+	どうしよう? 生きているかどうかを識別するように id を付けるか?
+
+	どうも、TaskManager.{h,cc} は要らないっぽい。TMmain に渡されるのも
+	SchedTask である方が自然。
+
+	TaskListInfo は循環リストなので、SPU/PPU scheduler に渡す前に、
+	getLast()->next = 0 する必要がある。freeAll() する前に、直さないと
+	だめ。getList() みたいなものを用意しても良いが...
+
+	Scheduler のconnector(DMA) / Memory 関連は Scheduler.{h,cc} から
+	追い出すべき。connector/memory とかを SchedTask に持たせれば良い。
+	そうすると、API追加でScheduelr.{h,cc} / TaskManagerImple とかを修正する
+	必要がなくなる。
 
 2010-5-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    speTaskList_bg は追放するべきだと思われる。(done)
-
-    PPE task はTaskList をすべて実行するまで戻って来ない。
-    なので、spe のmail checkが疎かになっている。
-    PPE task の実行途中で SPEのmail checkを行なうべき。
-
-    Fifo/Cell TaskManagerImpl は統一できるのではないか? (done)
-
-    SchedTask は今は各Taskのselfを返しているがTaskListにするべき
-    spe からのメールはTaskListが空になった時で良い。早めに、
-
-    PPE Taskを早めに起動する義理はある? あるかも知れない。Quick Reply Property。
-
-    TaskList もDataSegement化するべきだと思われる。(done)
-
-    Scheduler::task_list もDataSegment化して、メインメモリ上に置く。
+	speTaskList_bg は追放するべきだと思われる。(done)
+
+	PPE task はTaskList をすべて実行するまで戻って来ない。
+	なので、spe のmail checkが疎かになっている。
+	PPE task の実行途中で SPEのmail checkを行なうべき。
+
+	Fifo/Cell TaskManagerImpl は統一できるのではないか? (done)
+
+	SchedTask は今は各Taskのselfを返しているがTaskListにするべき
+	spe からのメールはTaskListが空になった時で良い。早めに、
+
+	PPE Taskを早めに起動する義理はある? あるかも知れない。Quick Reply Property。
+
+	TaskList もDataSegement化するべきだと思われる。(done)
+
+	Scheduler::task_list もDataSegment化して、メインメモリ上に置く。
 
 2010-4-28 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    SchedTaskBase のみにインスタンス変数を書かせて、
-    SchedTask*.h には method のみを書かせる。
-    そうすると、デバッグが楽だし、object のallocateも楽。(done)
-
-   HTask(list) -> TaskList(array) -> SchedTask
-
-    というcopyだが、SchedTask で最初から作る方が良いのかも。
-    それを DataSegment で共有する。
-
-    SimpleTask のMailを、
-       if (mail_is_not_full) send_mail() ;
-       else if (queue is not full) enqueuue() ;
-       else wait_mail();
-    ってな感じに出来ないの?
-
-    Multi thread にすると、PPEのmail loop が暴走する可能性がある。
-    このあたりなんか方法があるはずだが...
+	SchedTaskBase のみにインスタンス変数を書かせて、
+	SchedTask*.h には method のみを書かせる。
+	そうすると、デバッグが楽だし、object のallocateも楽。(done)
+
+	HTask(list) -> TaskList(array) -> SchedTask
+
+	というcopyだが、SchedTask で最初から作る方が良いのかも。
+	それを DataSegment で共有する。
+
+	SimpleTask のMailを、
+	if (mail_is_not_full) send_mail() ;
+	else if (queue is not full) enqueuue() ;
+	else wait_mail();
+	ってな感じに出来ないの?
+
+	Multi thread にすると、PPEのmail loop が暴走する可能性がある。
+	このあたりなんか方法があるはずだが...
 
 2010-4-24 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-     write   T3   T2  T1   TL  TA0  TA1
-     exec    T2   T1  TL   TA0 TA1  TA2
-     read    T1   TL  TA   TA1 TA2  T2 
-     next    T1   TL  TA   TA1 TA2* T2  
-
-     *のところで終了mailが出てTaskArrayのデータがfreeされてしまうので、よくない
-     そうならないように、一段TAN(SchedTaskArrayNop)を挟む。
-
-     write   T3   T2  T1   TL  TA0 TA1 TA2 TAN%
-     exec    T2   T1  TL   TA0 TA1 TA2 TAN T2
-     read    T1   TL  TA   TA1 TA2 TAN T2  T3
-     next    T1   TL  TA   TA1 TA2 TAN T2  T3 
-
-     %のところで終了mailを送る。T2のreadのところで、TaskArrayのデータはreadbuff上にあるので
-     破壊されてしまう。なので、savedTask->task->self の値はTANにコピーして持っていく必要がある
+	write   T3   T2  T1   TL  TA0  TA1
+	exec    T2   T1  TL   TA0 TA1  TA2
+	read    T1   TL  TA   TA1 TA2  T2 
+	next    T1   TL  TA   TA1 TA2* T2  
+
+	*のところで終了mailが出てTaskArrayのデータがfreeされてしまうので、よくない
+	そうならないように、一段TAN(SchedTaskArrayNop)を挟む。
+
+	write   T3   T2  T1   TL  TA0 TA1 TA2 TAN%
+	exec    T2   T1  TL   TA0 TA1 TA2 TAN T2
+	read    T1   TL  TA   TA1 TA2 TAN T2  T3
+	next    T1   TL  TA   TA1 TA2 TAN T2  T3 
+
+	%のところで終了mailを送る。T2のreadのところで、TaskArrayのデータはreadbuff上にあるので
+	破壊されてしまう。なので、savedTask->task->self の値はTANにコピーして持っていく必要がある
 
 2009-12-19 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   そうか、TaskList->next は、SPE 側で自分で呼び出しているわけね。
-   と言うことは、schdule(list) が終るまでは、mail check に戻って
-   こない... それだと、ちょっとまずいね。
-
-   となると、TaskList のfree(clear)のtimingは? schdule から抜けた
-   時と言うことになるわけだけど。
-
-   waitQueue は、実は不要。しかし、終了条件、dead lock detection には
-   必要らしい。
+	そうか、TaskList->next は、SPE 側で自分で呼び出しているわけね。
+	と言うことは、schdule(list) が終るまでは、mail check に戻って
+	こない... それだと、ちょっとまずいね。
+
+	となると、TaskList のfree(clear)のtimingは? schdule から抜けた
+	時と言うことになるわけだけど。
+
+	waitQueue は、実は不要。しかし、終了条件、dead lock detection には
+	必要らしい。
 
 2009-12-16 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   CellTaskManagerのTaskList_bg は変だよ。TaskList 自体が
-   queue なんだから、トップ二つを特別扱いしているだけでしょう。
-
-   TaskList をread()しているのと同時にnext()されてしまうので、
-   next()の中で、TaskList の中身に触るのは良くない。SchedTask
-   は微妙に大丈夫らしい。TLのdma waitは、write になっていた。
-
-   TaskArray/TaskArray1 は、TAの中身をnext()で判断しているので、
-   これはただしくない。TaskListLoad を間にはさむ手もあるが...
-
-     write   T3   T2  T1   TL  TA0   ! TL の dma wait
-     exec    T2   T1  TL!  TA0 TA1
-     read    T1   TL* TA   TA1 TA2   * TL の dma start
-     next    T1   TL% TA   TA1 TA2   % TAの作成判断
-
-  TaskListLoad をはさむ、安全だけど遅い方法
-
-     write   T3   T2  T1   TLL TL
-     exec    T2   T1  TLL! TL  TA0
-     read    T1   TLL*TL   TA0 TA1
-     next    T1   TLL TL%  TA0 TA1
-
-   なんだけど、pointer の下位ビットで送ると、前者で実行できる。
-   next で、TaskList のloadを始めてしまうという手もあるな...
-
-     write   T3   T2  T1   TL  TA0   ! TL の dma wait
-     exec    T2   T1  TL   TA0 TA1
-     read    T1   TL! TA   TA1 TA2   * TL の dma start
-     next    T1*  TL% TA   TA1 TA2   
-
-   こっっちかな...
+	CellTaskManagerのTaskList_bg は変だよ。TaskList 自体が
+	queue なんだから、トップ二つを特別扱いしているだけでしょう。
+
+	TaskList をread()しているのと同時にnext()されてしまうので、
+	next()の中で、TaskList の中身に触るのは良くない。SchedTask
+	は微妙に大丈夫らしい。TLのdma waitは、write になっていた。
+
+	TaskArray/TaskArray1 は、TAの中身をnext()で判断しているので、
+	これはただしくない。TaskListLoad を間にはさむ手もあるが...
+
+	write   T3   T2  T1   TL  TA0   ! TL の dma wait
+	exec    T2   T1  TL!  TA0 TA1
+	read    T1   TL* TA   TA1 TA2   * TL の dma start
+	next    T1   TL% TA   TA1 TA2   % TAの作成判断
+
+	TaskListLoad をはさむ、安全だけど遅い方法
+
+	write   T3   T2  T1   TLL TL
+	exec    T2   T1  TLL! TL  TA0
+	read    T1   TLL*TL   TA0 TA1
+	next    T1   TLL TL%  TA0 TA1
+
+	なんだけど、pointer の下位ビットで送ると、前者で実行できる。
+	next で、TaskList のloadを始めてしまうという手もあるな...
+
+	write   T3   T2  T1   TL  TA0   ! TL の dma wait
+	exec    T2   T1  TL   TA0 TA1
+	read    T1   TL! TA   TA1 TA2   * TL の dma start
+	next    T1*  TL% TA   TA1 TA2   
+
+	こっっちかな...
 
 2009-12-15 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   SimpleTask の実装が出来たので、TaskArray からは、
-   PPU側に詳細な情報を返せる。と言うことは、SPU側から
-   PPU Task を投入出来る。実装すればだけど。
-
-   Task 側から書き出し情報を設定するAPIが必要。
-   マニュアルも書くか。
-
-   Down cast をすべてなくしたい。Sched*.cc からは取れました。
-
-   まだ、いらないものが結構あるらしい...
+	SimpleTask の実装が出来たので、TaskArray からは、
+	PPU側に詳細な情報を返せる。と言うことは、SPU側から
+	PPU Task を投入出来る。実装すればだけど。
+
+	Task 側から書き出し情報を設定するAPIが必要。
+	マニュアルも書くか。
+
+	Down cast をすべてなくしたい。Sched*.cc からは取れました。
+
+	まだ、いらないものが結構あるらしい...
 
 2009-12-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   ようやっと動きました。SIMPLE_TASK でないのとの互換性
-   を維持するべきか? 頑張れば出来ると思うけど...
-
-   方法は二つ。TaskList に無理矢理 Task を詰め込むか、
-   今までのHTaskを、TaskArray に読み変えるか。前者は変更が
-   多い。後者は、wait_for が微妙。
-
-   前者で実装しました。そのうち落すかも。エラーチェックと、
-   エラー処理関数が必要。コメントを書かないと。
+	ようやっと動きました。SIMPLE_TASK でないのとの互換性
+	を維持するべきか? 頑張れば出来ると思うけど...
+
+	方法は二つ。TaskList に無理矢理 Task を詰め込むか、
+	今までのHTaskを、TaskArray に読み変えるか。前者は変更が
+	多い。後者は、wait_for が微妙。
+
+	前者で実装しました。そのうち落すかも。エラーチェックと、
+	エラー処理関数が必要。コメントを書かないと。
 
 2009-12-12 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   SchedTask::next で、TaskArray を認識して、そこで、
-   SchedTaskArrayLoad を作る。次のSchedTask を用意して、
-   SchedTaskArrayLoad にsavedSchedTaskとして引き渡す。
-   
-   SchedTaskArrayLoad::read は、TaskArray をload する。
-   SchedTaskArrayLoad::next は、SchedTaskArray を返す。
-   この時に、saveedSchedTask を引き継ぐ。
-   write/exec は何もしない。(これで、pipe line を空ける)
-
-   SchedTaskArray::read は、List DMA をload する。
-   SchedTaskArrayLoad::next は、TaskArray 上のTaskを返す。
-   exec/write は、List DMA 対応で動作する。
-   もうない場合には、SchedTaskArrayLoad から伝えられた
-   saveされた SchedTask を返す。mail も送る。
+	SchedTask::next で、TaskArray を認識して、そこで、
+	SchedTaskArrayLoad を作る。次のSchedTask を用意して、
+	SchedTaskArrayLoad にsavedSchedTaskとして引き渡す。
+	
+	SchedTaskArrayLoad::read は、TaskArray をload する。
+	SchedTaskArrayLoad::next は、SchedTaskArray を返す。
+	この時に、saveedSchedTask を引き継ぐ。
+	write/exec は何もしない。(これで、pipe line を空ける)
+
+	SchedTaskArray::read は、List DMA をload する。
+	SchedTaskArrayLoad::next は、TaskArray 上のTaskを返す。
+	exec/write は、List DMA 対応で動作する。
+	もうない場合には、SchedTaskArrayLoad から伝えられた
+	saveされた SchedTask を返す。mail も送る。
 
 2009-12-7 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    pipeline stageは、loop local だから、instance 変数である必
-    要はない。途中で中断することはない。これを一時変数にして、
-    再帰的にpipeline stage を呼び出せば良いらしい。
-
-    pipeline stage のtask1に引数で new SchedTaskList を渡すと、
-    run()でtask1 = new SchedNop() するよりループ二回ぐらい高速
-    になるらしい。が、おそらく、ほとんど影響はない。
-
-    pipelineで既に走っている次のTaskのreadを停める必要があるら
-    しい。前もってNopを入れて置く方法もあるが、TaskListの境界が
-    問題になる。停めないとパイプラインバッファを新たに取る必要
-    があり連鎖的にはまる。
-
-    writeしている奴もいるしな。スケジューラは一段しかネストしな
-    いから新しくバッファ取るか? いや、やっぱり許されないか。い
-    や、取るか。うーん、悩ましい。どうせ、Task list は確保しな
-    いとだめだから… 再帰しないで、もとのスケジューラで動かした
-    い
-
-    そのためには、既に Pipeline に入っているTaskが邪魔か。2つTask
-    を投入して、間に TaskList read が入ってもなんとかなるように
-    工夫するのが良いっぽい
-
-    なんか、Renew Task の道を歩んでいる気もするが...
+	pipeline stageは、loop local だから、instance 変数である必
+	要はない。途中で中断することはない。これを一時変数にして、
+	再帰的にpipeline stage を呼び出せば良いらしい。
+
+	pipeline stage のtask1に引数で new SchedTaskList を渡すと、
+	run()でtask1 = new SchedNop() するよりループ二回ぐらい高速
+	になるらしい。が、おそらく、ほとんど影響はない。
+
+	pipelineで既に走っている次のTaskのreadを停める必要があるら
+	しい。前もってNopを入れて置く方法もあるが、TaskListの境界が
+	問題になる。停めないとパイプラインバッファを新たに取る必要
+	があり連鎖的にはまる。
+
+	writeしている奴もいるしな。スケジューラは一段しかネストしな
+	いから新しくバッファ取るか? いや、やっぱり許されないか。い
+	や、取るか。うーん、悩ましい。どうせ、Task list は確保しな
+	いとだめだから… 再帰しないで、もとのスケジューラで動かした
+	い
+
+	そのためには、既に Pipeline に入っているTaskが邪魔か。2つTask
+	を投入して、間に TaskList read が入ってもなんとかなるように
+	工夫するのが良いっぽい
+
+	なんか、Renew Task の道を歩んでいる気もするが...
 
 2009-12-6 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    やっぱり、Graphical なprofileが欲しいかな。どのDMA/Taskに時間がかかっている
-    かが見えるようなものが。profile で、メインメモリにlogを書き出すようなもの
-    が必要。deubg 用のデータ書き出しツールがいるな。
-
-    log header
-       command(16)  cpu-id(16)  event(32)  time(64)
-       struct debug_log {
-            uint16 command;
-            uint16 cpu-id;
-            uint32 event;
-            uint32 time;
-       }
-    ぐらい?  get_segment 使うべきか。連続領域に使える get_segement があると
-    良いわけね。write とも言うが。
-
-    sort で、memcpy しているのは変。read/write buffer をflipしてやると
-    良い。両方とも握っているんだから問題ない。ただし、read/write buffer
-    の大きさは等しい必要がある。SchedTask->flip_read_write_buffer(); か?
-    sort ちゃんとは動いているんだよ。
-
-    word_count_test の稼働率が10%なのはひどい。word_count の方だと偏りが
-    あって、一部が50%になるが10%ぐらい。DMA待ちではなくて、メール待ちに
-    なっている。PPUネックになっているっぽい。
-
-    TaskArray は、SchedTask を拡張して処理する。next で、次のTaskを
-    用意する感じか。inData/outData の処理も。
+	やっぱり、Graphical なprofileが欲しいかな。どのDMA/Taskに時間がかかっている
+	かが見えるようなものが。profile で、メインメモリにlogを書き出すようなもの
+	が必要。deubg 用のデータ書き出しツールがいるな。
+
+	log header
+	command(16)  cpu-id(16)  event(32)  time(64)
+	struct debug_log {
+	    uint16 command;
+	    uint16 cpu-id;
+	    uint32 event;
+	    uint32 time;
+	}
+	ぐらい?  get_segment 使うべきか。連続領域に使える get_segement があると
+	良いわけね。write とも言うが。
+
+	sort で、memcpy しているのは変。read/write buffer をflipしてやると
+	良い。両方とも握っているんだから問題ない。ただし、read/write buffer
+	の大きさは等しい必要がある。SchedTask->flip_read_write_buffer(); か?
+	sort ちゃんとは動いているんだよ。
+
+	word_count_test の稼働率が10%なのはひどい。word_count の方だと偏りが
+	あって、一部が50%になるが10%ぐらい。DMA待ちではなくて、メール待ちに
+	なっている。PPUネックになっているっぽい。
+
+	TaskArray は、SchedTask を拡張して処理する。next で、次のTaskを
+	用意する感じか。inData/outData の処理も。
 
 2009-12-5 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    なんかなぁ。一つの機能を付け加えようとすると、
-
-    TaskManager/Cell/CellTaskManagerImpl.cc
-    TaskManager/Cell/CellTaskManagerImpl.h TaskManager/Cell/spe/CellDmaManager.cc
-    TaskManager/Cell/spe/CellDmaManager.h TaskManager/Cell/spe/ShowTime.cc TaskManager/Cell/spe/ShowTime.h
-    TaskManager/Cell/spe/SpeTaskManagerImpl.cc TaskManager/Cell/spe/SpeTaskManagerImpl.h
-    TaskManager/Cell/spe/main.cc TaskManager/Fifo/FifoTaskManagerImpl.cc
-    TaskManager/Fifo/FifoTaskManagerImpl.h TaskManager/Makefile.cell TaskManager/kernel/ppe/TaskManager.h
-    TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/DmaManager.h
-    TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h
-    TaskManager/kernel/schedule/Scheduler.h TaskManager/kernel/sys_task/SysTasks.h
-    example/word_count_test/main.cc
-
-    こんなにファイルをいじらないと出来ない。それって、全然、ダメじゃん。
-
-    なんでかなぁ。
+	なんかなぁ。一つの機能を付け加えようとすると、
+
+	TaskManager/Cell/CellTaskManagerImpl.cc
+	TaskManager/Cell/CellTaskManagerImpl.h TaskManager/Cell/spe/CellDmaManager.cc
+	TaskManager/Cell/spe/CellDmaManager.h TaskManager/Cell/spe/ShowTime.cc TaskManager/Cell/spe/ShowTime.h
+	TaskManager/Cell/spe/SpeTaskManagerImpl.cc TaskManager/Cell/spe/SpeTaskManagerImpl.h
+	TaskManager/Cell/spe/main.cc TaskManager/Fifo/FifoTaskManagerImpl.cc
+	TaskManager/Fifo/FifoTaskManagerImpl.h TaskManager/Makefile.cell TaskManager/kernel/ppe/TaskManager.h
+	TaskManager/kernel/ppe/TaskManagerImpl.h TaskManager/kernel/schedule/DmaManager.h
+	TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h
+	TaskManager/kernel/schedule/Scheduler.h TaskManager/kernel/sys_task/SysTasks.h
+	example/word_count_test/main.cc
+
+	こんなにファイルをいじらないと出来ない。それって、全然、ダメじゃん。
+
+	なんでかなぁ。
 	SchedTask -> Scheduler -> Connector 
 	TaskManagerImpl -> {CellTaskManager,FifoTaskManager/SpeTaskManager}
-    を全部、いじる羽目になる。
-    SchedTask から system call するより、Task を定義して、
-    それを呼び出すって方がましかも。
+	を全部、いじる羽目になる。
+	SchedTask から system call するより、Task を定義して、
+	それを呼び出すって方がましかも。
 
 
 2009-11-23 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
-    list.bound は廃止。list element から計算可能。
+	list.bound は廃止。list element から計算可能。
 
 2009-11-20 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    mail_sendQueue の実装がだめ。こういう実装をすると、queue の
-    正しさを関数の中に閉じ込められない。なんか、無限リストにな
-    っているらしい。参照が、渡り歩いているどこかの場所でダメに
-    なっているらしい。
-
-    実際、mail_sendQueue は、free list に置き換わってしまう。
-    これまで、これがおかしくならなかった理由は不明。
-
-    connector に外から手を入れないで、ちゃんとfunction callするべし。
-
-    わかりました。
-        if (list) {
-            ...
-            mainScheduler->send_mailList(in_mail_list);
-        }
-        out_mail_list = mainScheduler->recv_mailList();
-
-    としてしまったが、recv_mailList() でなく、send_mailList で、
-    mail_sendQueue をクリアしていたので、
-        } else {
-            mainScheduler->send_mailList(in_mail_list);
-        }
-    とする必要があったらしい。if (list) を入れたせいで、こうなった。
-    でも、当然、recv_mailList() で clear するべき。atomicity の意味でも。
-    なので、send_mailList() での clear は必要ない。
+	mail_sendQueue の実装がだめ。こういう実装をすると、queue の
+	正しさを関数の中に閉じ込められない。なんか、無限リストにな
+	っているらしい。参照が、渡り歩いているどこかの場所でダメに
+	なっているらしい。
+
+	実際、mail_sendQueue は、free list に置き換わってしまう。
+	これまで、これがおかしくならなかった理由は不明。
+
+	connector に外から手を入れないで、ちゃんとfunction callするべし。
+
+	わかりました。
+	if (list) {
+	    ...
+	    mainScheduler->send_mailList(in_mail_list);
+	}
+	out_mail_list = mainScheduler->recv_mailList();
+
+	としてしまったが、recv_mailList() でなく、send_mailList で、
+	mail_sendQueue をクリアしていたので、
+	} else {
+	    mainScheduler->send_mailList(in_mail_list);
+	}
+	とする必要があったらしい。if (list) を入れたせいで、こうなった。
+	でも、当然、recv_mailList() で clear するべき。atomicity の意味でも。
+	なので、send_mailList() での clear は必要ない。
 
 
 2009-11-19 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    finish_task を全員が待つ設定で、finish_task を終了判定に
-    使っている。それだと、すべてのtaskが、finish_task のwait queue
-    を*必ず*触りにいってしまう。
-
-    finish_task への待ちを取り除くと、CellTaskManagerImpl::run()
-    が、
+	finish_task を全員が待つ設定で、finish_task を終了判定に
+	使っている。それだと、すべてのtaskが、finish_task のwait queue
+	を*必ず*触りにいってしまう。
+
+	finish_task への待ちを取り除くと、CellTaskManagerImpl::run()
+	が、
 	do {
 	    ppeMail = ppeManager->schedule(ppeTaskList);
 		cont:
 	    ppeTaskList = mail_check(ppeMail);
 	} while (ppeTaskList);
-    とかやっているので、ここで抜けてしまう。
-
-    要するに、SPUの状態を見て、running がなくなるのを調べるべき
-    なんだが、SpeTheads は「一つしかない」らしい。spe_running 
-    で、走っているものがあるかどうか見るか?
-
-    Cell だと、MainScheduler と FifoScheduler の二種類の
-    スケジューラがあるのか。
+	とかやっているので、ここで抜けてしまう。
+
+	要するに、SPUの状態を見て、running がなくなるのを調べるべき
+	なんだが、SpeTheads は「一つしかない」らしい。spe_running 
+	で、走っているものがあるかどうか見るか?
+
+	Cell だと、MainScheduler と FifoScheduler の二種類の
+	スケジューラがあるのか。
 
 	 MainScheduler --- task list -----> FifoScheduler
 	 MainScheduler <-- finish task ---- FifoScheduler
 
-    というわけね。
+	というわけね。
 
 2009-11-15 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    List DMAって、32bit address を使っているらしい。それは、ちょっと
-    ひどいなぁ。
+	List DMAって、32bit address を使っているらしい。それは、ちょっと
+	ひどいなぁ。
 
 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-   やっぱり、TaskList の存在が許せない。あったとしても不定長でしょう。
-   無駄なコピーが多すぎる。
+	やっぱり、TaskList の存在が許せない。あったとしても不定長でしょう。
+	無駄なコピーが多すぎる。
 
 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    Scheduler / TaskManger / TaskManagerImpl の区別が不明
-    HTask は、TaskManagerImpl を持ってる。
-
-    Scheduler は SchedTask から直接見えないはずだが、SchedTask は、
-    Scheduler は知っているが、TaskManager は知らない。これがかなりの
-    混乱を生んでいる。
-
-    SPU上では、TaskManager が存在しないのが原因らしいが、allcoate とかは、
-    TaskManager が行うはず。なので、SPU上にもTaskManagerがある方が自然。
-
-    SchedTask が自分自身で scheduling してしまっているので、Scheduler
-    には、ほとんど仕事がない。なので、大半の処理を scheduler -> manager
-    経由で行うことになる。
+	Scheduler / TaskManger / TaskManagerImpl の区別が不明
+	HTask は、TaskManagerImpl を持ってる。
+
+	Scheduler は SchedTask から直接見えないはずだが、SchedTask は、
+	Scheduler は知っているが、TaskManager は知らない。これがかなりの
+	混乱を生んでいる。
+
+	SPU上では、TaskManager が存在しないのが原因らしいが、allcoate とかは、
+	TaskManager が行うはず。なので、SPU上にもTaskManagerがある方が自然。
+
+	SchedTask が自分自身で scheduling してしまっているので、Scheduler
+	には、ほとんど仕事がない。なので、大半の処理を scheduler -> manager
+	経由で行うことになる。
 
 2009-11-14 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    要するに、SPE task 側から addOutData できればよい。
-    でも、別に、PPE側から計算してもよいはずだけどね。
-    そうすれば、renew task は取り外せる。
+	要するに、SPE task 側から addOutData できればよい。
+	でも、別に、PPE側から計算してもよいはずだけどね。
+	そうすれば、renew task は取り外せる。
 
 	SchedDefineTask1(DrawSpanEnd,draw_span_end);
-    で、名前を指定させておいて、さらに、
-        SchedExternTask(DrawSpanEnd);
-        SchedRegisterTask(TASK_DRAW_SPAN_END, DrawSpanEnd);
-    で、新しく名前を要求するのって、なんとかならんの? 読みづらいんだよ。
-    DrawSpanEnd を、そのまま使ってもよさそうだけど?
-
-    せっかく、renew task を外したのに、HD crash で失ってしまいました。
-
-    add_param が順序を持っているのは見づらい。数字で指定する方が合理的。
+	で、名前を指定させておいて、さらに、
+	SchedExternTask(DrawSpanEnd);
+	SchedRegisterTask(TASK_DRAW_SPAN_END, DrawSpanEnd);
+	で、新しく名前を要求するのって、なんとかならんの? 読みづらいんだよ。
+	DrawSpanEnd を、そのまま使ってもよさそうだけど?
+
+	せっかく、renew task を外したのに、HD crash で失ってしまいました。
+
+	add_param が順序を持っているのは見づらい。数字で指定する方が合理的。
 
 2009-10-11 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    単純な、rbuf, wbuf + write return size の task のAPI
-    List DMA の API
-    投入 cpu 別の spawn method 
-    Redering 時の内部からの DMA への直接アクセスへの禁止等など
-
-    set_post で登録する関数も、task のrun関数と同じ型にした方が便利そう。
-
-    SPU側でも配列(TaskList)ではなく、TaskQueue で管理すれば、
-    renew task は簡単に実装できる。
-
-    SchedTask の renew かそうでないかの区別は全部なくす。ex_init とかは、
-    なくなるはず。その代わり TaskQueue で管理する。
-
-    TaskList に inListData/outListData が入っているのは、やはりおかしい。
-    もっとコンパクトであるべき。
-
-    TaskList は、こまめに終了をPPE側へ知らせるのではなく、TaskListの
-    書き換えで知らせる方が良い。
-
-    SPUからPPUへ、create task 出来た方が良い。それはTaskList の書き出し
-    で行なう。
+	単純な、rbuf, wbuf + write return size の task のAPI
+	List DMA の API
+	投入 cpu 別の spawn method 
+	Redering 時の内部からの DMA への直接アクセスへの禁止等など
+
+	set_post で登録する関数も、task のrun関数と同じ型にした方が便利そう。
+
+	SPU側でも配列(TaskList)ではなく、TaskQueue で管理すれば、
+	renew task は簡単に実装できる。
+
+	SchedTask の renew かそうでないかの区別は全部なくす。ex_init とかは、
+	なくなるはず。その代わり TaskQueue で管理する。
+
+	TaskList に inListData/outListData が入っているのは、やはりおかしい。
+	もっとコンパクトであるべき。
+
+	TaskList は、こまめに終了をPPE側へ知らせるのではなく、TaskListの
+	書き換えで知らせる方が良い。
+
+	SPUからPPUへ、create task 出来た方が良い。それはTaskList の書き出し
+	で行なう。
 
 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 な使い方が泣ける。ひどすぎます。
+	ようやっと直せました。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 で使っているので落せない。
+	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 が当然らしい。
+	TaskQueue のfree list の管理はシステムで一つであるべき。
+	TaskQueue は double linked list が当然らしい。
 
 2009-10-02 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    DrawSpan で、~DrawSpan() で、allocate したデータを DMA_WAIT
-    して、free しているが、これは、抽象化違反。Task で明示的に
-    DMAするのは禁止。Task 内で、add_outData 出来れば良い。
-
-    renew が正しいような気がするが...
-
-    Task 内で大域変数は使えない。なので、smanager からallocateする
-    必要がある。Task の解放のタイミングではなくて、パイプラインの
-    タイミングでDMA waitとfreeを行なう必要がある。DrawSpan の場合は、
-    add_outData で良いが、内部で allocate/free は行なう必要がある。
-    put_segement がパイプライン動作するべきなのか?
-
-    固定のDMA tagが邪魔。
-
-    DrawSpan は全般的にダメだな〜
-
-    でも、その変更は大きいので、とりあえず動くようにしたい。
-
-    memset 0 は、7.7.3 SL1 Data Cache Range Set to Zero コマンド
-    つかうべき。SPE側でやっても良い。でも、本来は全面埋まるのが
-    普通なのでどうでも良いけど。
+	DrawSpan で、~DrawSpan() で、allocate したデータを DMA_WAIT
+	して、free しているが、これは、抽象化違反。Task で明示的に
+	DMAするのは禁止。Task 内で、add_outData 出来れば良い。
+
+	renew が正しいような気がするが...
+
+	Task 内で大域変数は使えない。なので、smanager からallocateする
+	必要がある。Task の解放のタイミングではなくて、パイプラインの
+	タイミングでDMA waitとfreeを行なう必要がある。DrawSpan の場合は、
+	add_outData で良いが、内部で allocate/free は行なう必要がある。
+	put_segement がパイプライン動作するべきなのか?
+
+	固定のDMA tagが邪魔。
+
+	DrawSpan は全般的にダメだな〜
+
+	でも、その変更は大きいので、とりあえず動くようにしたい。
+
+	memset 0 は、7.7.3 SL1 Data Cache Range Set to Zero コマンド
+	つかうべき。SPE側でやっても良い。でも、本来は全面埋まるのが
+	普通なのでどうでも良いけど。
 
 2009-08-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    で、MemList/MemHash が TaskManager 側に移ったので、
-    これで、code の management を書くことが出来る。
-    そうすれば、SPEのメモリの限界をほんと気にする必要がなくなるはず。
-
-    その前に、get_segment の例題を直さないと。
-
-    DrawSpanRnew/reboot は使ってないらしい。
-
-    Tree は、配列にしないでlinkをSPE側からたどるようになっている。
-    それは良いのだが、Task 側で dma_wait するような実装は望ましくない。
-    この部分も書き直す必要がある。list 構造の SPE上の Iterator を
-    実装すれば良い。
-
-    memory 関係のコードが scheduler の下にあるのは面白くない。
-
-    Scheduler で実装(__scheduler)に移譲している部分は、headerに
-    移した方が良い。
+	で、MemList/MemHash が TaskManager 側に移ったので、
+	これで、code の management を書くことが出来る。
+	そうすれば、SPEのメモリの限界をほんと気にする必要がなくなるはず。
+
+	その前に、get_segment の例題を直さないと。
+
+	DrawSpanRnew/reboot は使ってないらしい。
+
+	Tree は、配列にしないでlinkをSPE側からたどるようになっている。
+	それは良いのだが、Task 側で dma_wait するような実装は望ましくない。
+	この部分も書き直す必要がある。list 構造の SPE上の Iterator を
+	実装すれば良い。
+
+	memory 関係のコードが scheduler の下にあるのは面白くない。
+
+	Scheduler で実装(__scheduler)に移譲している部分は、headerに
+	移した方が良い。
 
 2009-08-06 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    うーん、get_segemnt で、dma_wait のtagをなんとかする
-    必要があるらしい。get_tag() でなんとかなるけど、
-    他のtag との関係があるかな。
-
-    完全に見えなくするべきでしょうけど... 今はいい。
+	うーん、get_segemnt で、dma_wait のtagをなんとかする
+	必要があるらしい。get_tag() でなんとかなるけど、
+	他のtag との関係があるかな。
+
+	完全に見えなくするべきでしょうけど... 今はいい。
 
 2009-08-01 Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 
-    MemList は動いたので、今度は TileHash を TaskManager 側に移動する
-    必要がある。
-
-    その後、コードのLRUを書けば、Cerium は一通り出来上がり。
-
-    TaskManager と Scheduler の関係が一貫してない。複雑すぎる。
+	MemList は動いたので、今度は TileHash を TaskManager 側に移動する
+	必要がある。
+
+	その後、コードのLRUを書けば、Cerium は一通り出来上がり。
+
+	TaskManager と Scheduler の関係が一貫してない。複雑すぎる。
 
 
 2009-07-24 Kaito TAGANO <tkaito@cr.ie.u-ryukyu.ac.jp>
@@ -547,7 +589,7 @@
 	}
 
 	class MemList {
-	 	MemorySegment* first;
+		MemorySegment* first;
 		MemorySegment* last;
 
 		MemList* createMemList(uint32 size, uint32 count);
@@ -983,7 +1025,7 @@
 
 	  --- 記述例 ---
 	  printf("the number of available entries = %d\n",
-	          spe_in_mbox_status(spe_ctx));
+		  spe_in_mbox_status(spe_ctx));
 
 	  --- 実行結果 ---
 	  the number of available entries = 4
@@ -1059,13 +1101,13 @@
 	使っているので、SchedTask にそって実行する場合、
 
 	  __scheduler->dma_load(__inListData, (uint32)__task->inData,
-	                        sizeof(ListData), DMA_READ_IN_LIST);
+				sizeof(ListData), DMA_READ_IN_LIST);
 	  __scheduler->dma_load(__outListData, (uint32)__task->outData,
-	                        sizeof(ListData), DMA_READ_OUT_LIST);
+				sizeof(ListData), DMA_READ_OUT_LIST);
 
 	の代わりに
 
- 	  memcpy(__inListData, __task->inData, sizeof(ListData));
+	  memcpy(__inListData, __task->inData, sizeof(ListData));
 	  memcpy(__outListData, __task->outData, sizeof(ListData));
 	  free(__task->inData);
 	  free(__task->outData);
@@ -1088,8 +1130,8 @@
 	  test_cpy(int flag, int *src)
 	  {
 	      if (flag) {
-	          memcpy(data, src, sizeof(int)*length);
-	          free(src);
+		  memcpy(data, src, sizeof(int)*length);
+		  free(src);
 	      }
 	  }
 
@@ -1100,13 +1142,13 @@
 	  test_nocpy(int flag, int *src)
 	  {
 	      if (flag) {
-	          data = src;
+		  data = src;
 	      }
 
 	      // この部分を SchedTask::~SchedTask() と
 	      // 思ってください
 	      if (flag) {
-	          free(data);
+		  free(data);
 	      }
 	  }
 
@@ -1116,7 +1158,7 @@
 	flag は 1 or 0 の繰り返しです。
 
 	- 実行結果 (1)
- 	  :no copy
+	  :no copy
 	  SPE time by SPU Decrementer: 0.035500
 	  :copy
 	  SPE time by SPU Decrementer: 0.057500
@@ -1141,7 +1183,7 @@
 	  test_nocpy(int flag, int *src)
 	  {
 	      if (flag) {
-	          data = src;
+		  data = src;
 	      }
 
 	      free((void*)(flag*(int)data));
@@ -1213,11 +1255,11 @@
 	      free((TaskListPtr)(__flag_renewTask*(int)(__list)));
 	  #else
 	      if (__flag_renewTask) {
-	          free(__inListData);
-                  free(__outListData);
-                  free(__list);
+		  free(__inListData);
+		  free(__outListData);
+		  free(__list);
 	      }
-          #endif
+	  #endif
 
 	こんな感じで、いくつかか if 文を消してみた。
 	そして、PPE側の main.cc で gettimeofday で計測してみた (各10回)
@@ -1332,7 +1374,7 @@
 	    free((void*)(flag_renewTask*(int)(list)));
 	#else
 	    if (flag_renewTask) {
-	        free(list);
+		free(list);
 	    }
 	#endif
 
@@ -1611,7 +1653,7 @@
 
 	* add (API): set_post
 
-  	  create_task(id, 0);
+	  create_task(id, 0);
 
 	とかわざわざ 0 付けるのもアレなので、もうそれように
 
@@ -1838,9 +1880,9 @@
 	今までは
 
 	    if (spe_out_mbox_read(spe_ctx[speid], &ret, 1) < 0) {
-	        return ret;
+		return ret;
 	    else
-	        return -1;
+		return -1;
 
 	とやっていた。これは
 
@@ -1996,7 +2038,7 @@
 	セマフォの P 動作は、基本的に
 
 	---------------------
-        pthread_mutex_lock(&sem->mutex);
+	pthread_mutex_lock(&sem->mutex);
 
 	while(sem->value == 0) { // 資源が無い
 	    // 条件付き変数に自分を登録して、ロックを解放して、他の
@@ -2166,7 +2208,7 @@
 	必要がある。その計算をミスってました。
 
 	1 //////////
-	              <- なぜか書き込まれていない
+		      <- なぜか書き込まれていない
 	  //////////
 	  //////////
 
--- a/TaskManager/Fifo/FifoDmaManager.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Fifo/FifoDmaManager.h	Fri Dec 17 00:18:36 2010 +0900
@@ -34,6 +34,7 @@
     void mail_write_queue(memaddr data) { mail_queue1->send(data); }
     void mail_write_finish_list(memaddr data) { mail_queue1->send(data); }
     memaddr mail_read() { return mail_queue2->recv(); }
+    memaddr task_list_mail_read() { return mail_queue2->recv(); }
 
     void mail_write_from_host(memaddr data) { mail_queue2->send(data); }
     memaddr mail_read_from_host() { return mail_queue1->recv(); }
--- a/TaskManager/Fifo/FifoTaskManagerImpl.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -30,7 +30,7 @@
  * FifoScheduler は PPE 側のスケジューラ
  */
 void
-FifoTaskManagerImpl::init()
+FifoTaskManagerImpl::init(int spuIdle_)
 {
     // TaskManager から呼ばれるので、かなりの部分は初期化されている。
 
@@ -200,6 +200,12 @@
 	others->polling();
 }
 
+void
+FifoTaskManagerImpl::print_arch()
+{
+    printf("FifoTaskManagerImpl\n");
+}
+
 /**
  * # # # # # # # # 
  *   Abstract Factory Pattern
--- a/TaskManager/Fifo/FifoTaskManagerImpl.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Fifo/FifoTaskManagerImpl.h	Fri Dec 17 00:18:36 2010 +0900
@@ -21,7 +21,7 @@
 
     /* functions */
     // call by system
-    void init();
+    void init(int spuIdle);
     void init(MainScheduler*, TaskManagerImpl*);
     void poll();  // called from CellTaskManagerImpl
     void run();
@@ -35,6 +35,8 @@
     void set_runTaskList();
     void sendTaskList();
 
+    void print_arch();
+
     // call by user
 
 };
--- a/TaskManager/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -17,7 +17,8 @@
     $(CELL_SPE_DIR)/Scheduler.cc\
     $(CELL_SPE_DIR)/SchedNop.cc        \
     $(CELL_SPE_DIR)/MemList.cc        \
-    $(CELL_SPE_DIR)/MemHash.cc        
+    $(CELL_SPE_DIR)/MemHash.cc    \
+    $(CELL_SPE_DIR)/MailManager.cc        
 CELL_SPE_SCHEDULE_OBJ = $(CELL_SPE_SCHEDULE_SRC:.cc=.o)
 
 CELL_SPE_SRCS =  \
@@ -60,7 +61,7 @@
 $(CELL_SPE_SCHEDULE_SRC): kernel/schedule/*.cc kernel/memory/*.cc kernel/ppe/*.cc
 	cp kernel/schedule/*.cc $(CELL_SPE_DIR)/
 	cp kernel/memory/*.cc $(CELL_SPE_DIR)/
-	cp kernel/ppe/{TaskQueue.cc,Task.cc} $(CELL_SPE_DIR)/
+	cp kernel/ppe/{TaskQueue.cc,Task.cc,MailManager.cc} $(CELL_SPE_DIR)/
 
 $(CELL_SPE_OBJS): %.o : %.cc
 	$(SPUCC)  $(SPE_CFLAGS) $(INCLUDE) -c $< -o $@
--- a/TaskManager/kernel/main.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/kernel/main.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -34,17 +34,19 @@
 main(int argc, char *argv[])
 {
     int machineNum = 1;
-
+    int speIdle = 0;
     for (int i = 1; argv[i]; ++i) {
         if (strcmp(argv[i], "-cpu") == 0) {
             machineNum = atoi(argv[++i]);
         } else if (strcmp(argv[i], "-p") == 0) {
 	    profile = 1;
-        }
+        } else if (strcmp(argv[i], "-speidle") == 0) {
+	    speIdle = atoi(argv[++i]);
+	}
     }
 
     TaskManager *manager = new TaskManager(machineNum);
-    manager->init();
+    manager->init(speIdle);
 
     manager->set_TMend(defaultTMend);
 
--- a/TaskManager/kernel/ppe/TaskManager.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskManager.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -32,10 +32,10 @@
 extern TaskManagerImpl* create_impl(int);
 
 void
-TaskManager::init()
+TaskManager::init(int spuIdle)
 {
     m_impl = create_impl(machineNum);
-    m_impl->init();
+    m_impl->init(spuIdle);
     m_impl->systask_init();
 }
 
--- a/TaskManager/kernel/ppe/TaskManager.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskManager.h	Fri Dec 17 00:18:36 2010 +0900
@@ -39,7 +39,7 @@
     }
 
     /* functions */
-    void init();
+    void init(int spuIdle);
     void finish();
 
 private:
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -118,6 +118,58 @@
     return ta;
 }
 
+/* call get_task_name from ppu only */
+const char *
+TaskManagerImpl::get_task_name(int cmd) {
+	if (0 <= cmd && cmd < MAX_TASK_OBJECT)
+		return task_list[cmd].name;
+	else
+		return NULL;
+}
+const char *
+TaskManagerImpl::get_task_name(TaskPtr task) {
+	return task != NULL ? get_task_name(task->command) : NULL;
+}
+const char *
+TaskManagerImpl::get_task_name(SimpleTaskPtr simple_task) {
+	return simple_task != NULL ? get_task_name(simple_task->command) : NULL;
+}
+const char *
+TaskManagerImpl::get_task_name(SchedTaskBase *sched_task) {
+	if (sched_task == NULL) return NULL;
+	if (sched_task->task != NULL) {
+		return get_task_name(sched_task->task->command);
+	} else if (sched_task->atask != NULL) {
+		return get_task_name(sched_task->atask->command);
+	}
+	return NULL;
+}
+const char *
+TaskManagerImpl::get_task_name(HTaskPtr htask) {
+	return get_task_name(htask, 0);
+}
+const char *
+TaskManagerImpl::get_task_name(HTaskPtr htask, int index) {
+	if (!htask)	return NULL;
+	switch (htask->command) {
+	case TaskArray1:
+		return get_task_name((TaskPtr)htask->rbuf);
+		break;
+	case TaskArray: {
+		HTaskPtr t = htask->next;
+		for (int i = 0; i < index; i++) {
+			if (!t->next) return NULL;
+			t = t->next;
+		}
+		return get_task_name(t->command);
+		break;
+	}
+	default:
+		return get_task_name(htask->command);
+	}
+	return NULL;
+}
+
 /**
  * task の依存関係を設定
  * master task が終わってから、slave task を実行するように
--- a/TaskManager/kernel/ppe/TaskManagerImpl.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.h	Fri Dec 17 00:18:36 2010 +0900
@@ -37,13 +37,14 @@
 
     /* functions */
     // system
-    virtual void init() = 0;
+    virtual void init(int) = 0;
     virtual void run() = 0;
     virtual void start_profile() = 0;
     virtual void show_profile() = 0;
     virtual void append_activeTask(HTaskPtr);
     virtual void append_waitTask(HTaskPtr);
     virtual void polling() = 0;
+    virtual void print_arch() = 0;
 
     void check_task_finish(HTaskPtr task, QueueInfo<HTask> *wait_queue);
     void check_task_list_finish(SchedTask *s, TaskListPtr list, QueueInfo<HTask> *wait_queue);
@@ -54,10 +55,16 @@
     virtual HTaskPtr create_task(int cmd,void *from);
     virtual HTaskPtr create_task(int cmd, memaddr rbuf, long r_size, memaddr wbuf, long w_size,void *from);
     virtual HTaskPtr create_task_array(int id, int num_task, int num_param, int num_inData, int num_outData,void *from);
+	const char *get_task_name(int cmd);
+	const char *get_task_name(TaskPtr task);
+	const char *get_task_name(SimpleTaskPtr simpletask);
+	const char *get_task_name(SchedTaskBase *schedtask);
+	const char *get_task_name(HTaskPtr htask);
+	const char *get_task_name(HTaskPtr htask, int index);
     virtual void set_task_depend(HTaskPtr master, HTaskPtr slave);
     virtual void spawn_task(HTaskPtr);
     virtual void set_task_cpu(HTaskPtr, CPU_TYPE);
-    void set_taskList(HTaskPtr htask, QueueInfo<TaskList> * taskList) ; 
+    void set_taskList(HTaskPtr htask, QueueInfo<TaskList> * taskList);
 
     void free_htask(HTaskPtr htask) {
 #if !defined(__SPU__)
--- a/TaskManager/kernel/schedule/DmaManager.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/kernel/schedule/DmaManager.h	Fri Dec 17 00:18:36 2010 +0900
@@ -35,6 +35,7 @@
     virtual void mail_write_queue(memaddr data) {}
     virtual void mail_write_finish_list(memaddr data) {}
     virtual memaddr mail_read() { return 0; }
+    virtual memaddr task_list_mail_read() { return 0; }
     
     // API for MFC list DMA transfer
     virtual void dma_loadList(ListDataPtr list, void *,uint32 mask) {}
--- a/TaskManager/kernel/schedule/SchedMail.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/kernel/schedule/SchedMail.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -7,7 +7,7 @@
 SchedMail::next(Scheduler *scheduler, SchedTaskBase *p)
 {
     
-    params_addr = scheduler->mail_read();
+   params_addr = scheduler->task_list_mail_read();
 
     __debug("[SchedMail:%s]\n", __FUNCTION__);
 
--- a/TaskManager/kernel/schedule/Scheduler.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -174,6 +174,12 @@
     return connector->mail_read();
 }
 
+memaddr
+Scheduler::task_list_mail_read()
+{
+    return connector->task_list_mail_read();
+}
+
 
 
 /*
@@ -290,17 +296,19 @@
 }
 
 extern void 
-register_task(int cmd, TaskObjectRun run)
+register_task(int cmd, TaskObjectRun run, const char *str)
 {
     task_list[cmd].run = run;
     task_list[cmd].load = null_loader;
     task_list[cmd].wait = null_waiter;
+	task_list[cmd].name = str;
 }
 
 extern void 
 register_dynamic_task(int cmd, 
     memaddr start, int size,
-    TaskObjectRun run, int entry_offset)
+    TaskObjectRun run, int entry_offset,
+    const char *str)
 {
     task_list[cmd].run = run;
     task_list[cmd].location = start;
@@ -309,6 +317,7 @@
     task_list[cmd].entry_offset = entry_offset;
     task_list[cmd].load = load_task;
     task_list[cmd].wait = wait_load;
+	task_list[cmd].name = str;
 #if 0
 this->printf("cmd        = %d\n",cmd);
 this->printf("locatation = 0x%x\n",start);
--- a/TaskManager/kernel/schedule/Scheduler.h	Fri Nov 05 22:43:25 2010 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.h	Fri Dec 17 00:18:36 2010 +0900
@@ -37,6 +37,7 @@
     memaddr end;            
     uint32 entry_offset;        // offset for create();
     MemorySegment *segment;
+	const char *name;
     void (*load)(Scheduler *,int);
     void (*wait)(Scheduler *,int);
 }  __attribute__ ((aligned (DEFAULT_ALIGNMENT)))
@@ -126,6 +127,7 @@
     void mail_write_queue(memaddr data);
     void mail_write_finish_list(memaddr data);
     memaddr mail_read();
+    memaddr task_list_mail_read();
     void dma_loadList(ListDataPtr list, void *, uint32 mask);
     void dma_storeList(ListDataPtr list, void *, uint32 mask);
 
@@ -144,10 +146,11 @@
 
 }  ;
 
-extern void register_task(int cmd, TaskObjectRun run);
+extern void register_task(int cmd, TaskObjectRun run, const char *str);
 extern void register_dynamic_task(int cmd, 
     memaddr start, int size, TaskObjectRun run,
-    int entry_offset);
+	int entry_offset,
+	const char *str);
 
 struct tbl { 
     unsigned int vma; 
@@ -189,10 +192,10 @@
     }
 
 #define SchedRegisterTask(cmd, str)             \
-    register_task(cmd, runTask_##str);
+    register_task(cmd, runTask_##str, #str);
 
 #define SchedRegister(str)             \
-    register_task(str, runTask_##str);
+    register_task(str, runTask_##str, #str);
 
 #define SchedDefineDynamicTask(str,segment)                             \
     SchedDefineTask(str)
@@ -214,7 +217,8 @@
     register_dynamic_task(cmd,  (memaddr)(_EAR_+_ovly_table[segment].file_offset), \
 		     _ovly_table[segment].size, \
                     runTask_##str, \
-	runTask_##str##_offset);
+						  runTask_##str##_offset, \
+		#str);
 #define SchedRegisterDynamic(str, segment) SchedRegisterDynamicTask(str, str, segment)                    
 #else
 #define SchedRegisterDynamicTask(cmd, str, segment) SchedRegisterTask(cmd, str)
--- a/example/Bulk/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/Bulk/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/Bulk/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/Bulk/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/Bulk/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/Bulk/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/HelloWorld/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/HelloWorld/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -4,7 +4,7 @@
 CFLAGS += -m$(ABIBIT)  -D__CERIUM_CELL__
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/HelloWorld/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/HelloWorld/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/HelloWorld/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/HelloWorld/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/HelloWorld/main.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/HelloWorld/main.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -7,8 +7,10 @@
 extern void task_init(void);
 
 static int count = 1;
+static int spe_num = 1;
 
 extern TaskManager *manager;
+int use_task_creater = 0;
 
 const char *usr_help_str = "Usage: ./hello [-cpu spe_num] [-count N]\n\
   -cpu    Number of SPE (default 1) \n\
@@ -20,24 +22,136 @@
     for (int i = 1; argv[i]; ++i) {
 	if (strcmp(argv[i], "-count") == 0) {
             count = atoi(argv[++i]);
-        }
+        } else if (strcmp(argv[i], "-cpu") == 0) {
+	    spe_num = atoi(argv[i+1]);
+	} else if (strcmp(argv[i], "-t") == 0) {
+	    use_task_creater = 1;
+	} 
+
+
 
     }
 
     return 0;
 }
 
+
+static void simple_task_creater(int in_total_size, int out_total_size, 
+			     int command, int in_data_size, int out_data_size, 
+			     void *in_data, void *out_data, TaskManager *manager,
+			     HTask *wait_i, HTask *wait_me) {
+
+
+  int in_task_size = 0;
+  int out_task_size = 0;
+
+  if (in_total_size != 0) {
+    in_task_size = in_total_size / in_data_size;
+    if (in_total_size != in_task_size * in_data_size) {
+      printf("mismatch of in_total_size and in_data_size\n");
+    }
+  }
+
+  if (out_total_size != 0) {
+    out_task_size = out_total_size / out_data_size;
+    if (out_total_size != out_task_size * out_data_size) {
+      printf("mismatch of out_total_size and out_data_size\n");
+    }
+  }
+ 
+  /*in, out の大きい方に合わせるのがいいかな? Taskの数は1Task分に使うデータの大きいほうを取るような仕様がいいかな*/
+  int task_num = (in_task_size > out_task_size) ? in_task_size : out_task_size;
+
+  if (task_num == 0) task_num = 1;
+
+  /*spe分あればいいのかな?*/
+
+  int array_num = spe_num;
+  if (task_num < array_num) {
+    array_num = task_num;
+  }
+
+
+  int array_length = task_num / array_num;
+  int rest = task_num % array_num;
+
+  HTaskPtr *task_array = (HTask**)manager->allocate(sizeof(HTask*)*array_num);
+  TaskPtr *t_exec = (Task**)manager->allocate(sizeof(Task*)*array_length*array_num);
+
+  int index = 0;
+  
+  for (int k = 0; k < array_num; k++) {
+
+    task_array[k] = manager->create_task_array(command,array_length,0,1,1);
+    t_exec[k] = 0;
+    
+    if (wait_me != 0) {
+      wait_me->wait_for(task_array[k]);
+    }
+    if (wait_i != 0) {
+      task_array[k]->wait_for(wait_i);
+    }
+    
+  }
+
+  for (int j = 0; j < array_length; j++) {
+    for (int k = 0; k < array_num; k++) {
+      
+      t_exec[k] = task_array[k]->next_task_array(command,t_exec[k]);
+      t_exec[k]->set_inData(0,(char*)in_data + index*in_data_size, in_data_size);
+      t_exec[k]->set_outData(0,(char*)out_data + index*out_data_size, out_data_size);
+
+      index++;
+
+    }
+  }
+  
+  for (int k = 0; k < array_num; k++) {
+    task_array[k]->spawn_task_array(t_exec[k]->next());
+    task_array[k]->set_cpu(SPE_ANY);
+    task_array[k]->spawn();
+  }	
+
+  for (int k = 0; k < rest; k++) {
+    HTaskPtr t_exec = manager->create_task(command);
+    
+    t_exec->set_inData(0,(char*)in_data + index*in_data_size, in_data_size);
+    t_exec->set_outData(0,(char*)out_data + index*out_data_size, out_data_size);
+      
+    index++;
+
+    if (wait_me != 0) {
+      wait_me->wait_for(t_exec);
+    }
+    if (wait_i != 0) {
+      t_exec->wait_for(wait_i);
+    }
+
+    t_exec->set_cpu(SPE_ANY);
+    t_exec->spawn();
+
+  }
+
+
+}
+
 void
 hello_init(TaskManager *manager)
 {
 
-
     for (int i = 0; i < count; i++) {
 	/**
 	 * Create Task
 	 *   create_task(Task ID);
 	 */
 
+
+      if (use_task_creater) {
+
+	simple_task_creater(0,0,Hello,0,0,0,0,manager,0,0);	
+
+      } else {
+
 	HTask *hello = manager->create_task(Hello);
 
 	/**
@@ -54,7 +168,10 @@
 	hello->set_param(0,(memaddr)i);
 
 	hello->spawn();
+      }
     }
+
+
 }
 
 int
--- a/example/HelloWorld/spe/Hello.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/HelloWorld/spe/Hello.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -3,10 +3,10 @@
 #include "Func.h"
 
 /* これは必須 */
-SchedDefineTask(Hello);
+SchedDefineTask1(Hello,hello);
 
 static int
-run(SchedTask *smanager, void *rbuf, void *wbuf)
+hello(SchedTask *smanager, void *rbuf, void *wbuf)
 {
     long task_id = (long)smanager->get_param(0);
 
--- a/example/HelloWorld/spe/spe-main.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/HelloWorld/spe/spe-main.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -10,5 +10,5 @@
 void
 task_init(Scheduler *s)
 {
-    SchedRegisterTask(HELLO_TASK, Hello);
+    SchedRegister(Hello);
 }
--- a/example/MemList/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/MemList/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/MemList/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/MemList/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/Pipeline/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/Pipeline/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -3,7 +3,7 @@
 ABIBIT = 32
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/Pipeline/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/Pipeline/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/Pipeline/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/Pipeline/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/Simple/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/Simple/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -3,7 +3,7 @@
 ABIBIT = 32
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/Simple/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/Simple/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/Simple/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/Simple/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/basic/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/basic/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/basic/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/basic/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/basic/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/basic/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/dependency_task/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/dependency_task/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/dependency_task/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/dependency_task/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/dependency_task/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/dependency_task/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/get_segment/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/get_segment/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/get_segment/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/get_segment/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -3,7 +3,7 @@
 CC += -m64 
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/hello_array/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/hello_array/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/hello_array/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/hello_array/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/hello_array/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/hello_array/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/mainMem/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/mainMem/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/mainMem/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/mainMem/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/mainMem/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/mainMem/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/many_task/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/many_task/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =   # ե
+SRCS_EXCLUDE =   # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/many_task/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/many_task/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =   # ե
+SRCS_EXCLUDE =   # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/many_task/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/many_task/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -2,7 +2,7 @@
 
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =   # ե
+SRCS_EXCLUDE =   # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/post_function/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/post_function/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/post_function/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/post_function/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/post_function/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/post_function/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/renew_task/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/renew_task/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/renew_task/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/renew_task/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/renew_task/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/renew_task/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/share_task/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/share_task/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/share_task/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/share_task/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/share_task/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/share_task/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/task_queue/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/task_queue/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/task_queue/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/task_queue/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/task_queue/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/task_queue/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/word_count/Makefile.cell	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/word_count/Makefile.cell	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/word_count/Makefile.linux	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/word_count/Makefile.linux	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/word_count/Makefile.macosx	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/word_count/Makefile.macosx	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 include ./Makefile.def
 
 SRCS_TMP = $(wildcard *.cc)
-SRCS_EXCLUDE =  # ե
+SRCS_EXCLUDE =  # 除外するファイルを書く
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cc=.o)
 
--- a/example/word_count/main.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/word_count/main.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -15,6 +15,7 @@
 
 int all = 0;
 int use_task_array = 1;
+int use_task_creater = 0;
 int use_compat = 0;
 int array_task_num = 8;
 int spe_num = 1;
@@ -27,6 +28,105 @@
 } st_mmap_t;
 
 
+static void simple_task_creater(int in_total_size, int out_total_size, 
+			     int command, int in_data_size, int out_data_size, 
+			     void *in_data, void *out_data, SchedTask *manager,
+			     HTask *wait_i, HTask *wait_me) {
+
+
+  int in_task_size = 0;
+  int out_task_size = 0;
+
+  if (in_total_size != 0) {
+    in_task_size = in_total_size / in_data_size;
+    if (in_total_size != in_task_size * in_data_size) {
+      printf("mismatch of in_total_size and in_data_size\n");
+    }
+  }
+
+  if (out_total_size != 0) {
+    out_task_size = out_total_size / out_data_size;
+    if (out_total_size != out_task_size * out_data_size) {
+      printf("mismatch of out_total_size and out_data_size\n");
+    }
+  }
+ 
+  /*in, out の大きい方に合わせるのがいいかな? Taskの数は1Task分に使うデータの大きいほうを取るような仕様がいいかな*/
+  int task_num = (in_task_size > out_task_size) ? in_task_size : out_task_size;
+
+  if (task_num == 0) task_num = 1;
+
+  /*spe分あればいいのかな?*/
+
+  int array_num = spe_num;
+  if (task_num < array_num) {
+    array_num = task_num;
+  }
+
+
+  HTaskPtr *task_array = (HTask**)manager->allocate(sizeof(HTask*)*array_num);
+  TaskPtr *t_exec = (Task**)manager->allocate(sizeof(Task*)*array_num);
+
+  int array_length = task_num / array_num;
+  int rest = task_num % array_num;
+
+  int index = 0;
+  
+  for (int k = 0; k < array_num; k++) {
+
+    task_array[k] = manager->create_task_array(command,array_length,0,1,1);
+    t_exec[k] = 0;
+    
+    if (wait_me != 0) {
+      wait_me->wait_for(task_array[k]);
+    }
+    if (wait_i != 0) {
+      task_array[k]->wait_for(wait_i);
+    }
+    
+  }
+
+  for (int j = 0; j < array_length; j++) {
+    for (int k = 0; k < array_num; k++) {
+      
+      t_exec[k] = task_array[k]->next_task_array(command,t_exec[k]);
+      t_exec[k]->set_inData(0,(char*)in_data + index*in_data_size, in_data_size);
+      t_exec[k]->set_outData(0,(char*)out_data + index*out_data_size, out_data_size);
+
+      index++;
+
+    }
+  }
+  
+  for (int k = 0; k < array_num; k++) {
+    task_array[k]->spawn_task_array(t_exec[k]->next());
+    task_array[k]->set_cpu(SPE_ANY);
+    task_array[k]->spawn();
+  }	
+
+  for (int k = 0; k < rest; k++) {
+    HTaskPtr t_exec = manager->create_task(command);
+    
+    t_exec->set_inData(0,(char*)in_data + index*in_data_size, in_data_size);
+    t_exec->set_outData(0,(char*)out_data + index*out_data_size, out_data_size);
+      
+    index++;
+
+    if (wait_me != 0) {
+      wait_me->wait_for(t_exec);
+    }
+    if (wait_i != 0) {
+      t_exec->wait_for(wait_i);
+    }
+
+    t_exec->spawn();
+    t_exec->set_cpu(SPE_ANY);
+
+  }
+
+
+}
+
 
 /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/
 static int
@@ -77,12 +177,23 @@
 static void
 run_tasks(SchedTask *manager, WordCount *w, int task_count, HTaskPtr t_next, int size) 
 {
-  
+ 
   if (task_count < array_task_num) {
     array_task_num = task_count;
     if (task_count<=0) return;
   }
-  
+ 
+  //static void simple_task_creater(int in_total_size, int out_total_size, 
+  //			     int command, int in_data_size, int out_data_size, 
+  //			     void *in_data, void *out_data, TaskManager *manager,
+  //			     HTask *wait_i, HTask *wait_me)
+
+
+
+  if (use_task_creater) {
+    simple_task_creater(w->file_size, w->division_out_size * w->task_num, TASK_EXEC, w->division_size, w->division_out_size,
+			w->file_mmap, w->o_data, manager, w->t_print, 0);
+  }
 
   if (use_task_array) {
 
@@ -172,7 +283,7 @@
   
   for (int i = 0; i < task_count; i += array_task_num) {
 
-  HTask *h_exec = 0;
+    HTask *h_exec = 0;
     for (int j = 0; j < array_task_num; j++) {
 	int i = w->task_spwaned++;
 	if (w->size < size) size = w->size;
@@ -183,6 +294,7 @@
 	    h_exec->set_inData(0,w->file_mmap + i*w->division_size, size);
 	    h_exec->set_outData(0,w->o_data + i*w->out_size, w->division_out_size);
 
+
 	    if (all) {
 	      w->t_print->wait_for(h_exec);
 	    } else {
@@ -345,6 +457,10 @@
 	} else if (strcmp(argv[i], "-s") == 0) {
 	    use_task_array = 0;
 	    use_compat = 0;
+	} else if (strcmp(argv[i], "-t") == 0) {
+	    use_task_creater = 1;
+	    use_task_array = 0;
+	    use_compat = 0;
 	} else if (strcmp(argv[i], "-anum") == 0) {
 	    array_task_num = atoi(argv[i+1]);
 	} else if (strcmp(argv[i], "-cpu") == 0) {
--- a/example/word_count/spe/Exec.cc	Fri Nov 05 22:43:25 2010 +0900
+++ b/example/word_count/spe/Exec.cc	Fri Dec 17 00:18:36 2010 +0900
@@ -17,7 +17,7 @@
     int word_num = 0;
     int line_num = 0;
     int i = 0;
-    
+
     head_tail_flag[0] = (i_data[0] != 0x20) && (i_data[0] != 0x0A);
     word_num -= 1-head_tail_flag[0];
 
--- a/old/simple_render/Makefile	Fri Nov 05 22:43:25 2010 +0900
+++ b/old/simple_render/Makefile	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 TARGET = test_nogl
 
 SRCS_TMP = $(wildcard *.cpp)
-SRCS_EXCLUDE = fb.cpp # 
+SRCS_EXCLUDE = fb.cpp # 除外
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cpp=.o)
 
--- a/old/simple_render/spe/Makefile	Fri Nov 05 22:43:25 2010 +0900
+++ b/old/simple_render/spe/Makefile	Fri Dec 17 00:18:36 2010 +0900
@@ -1,7 +1,7 @@
 TARGET = ../spe-main
 
 SRCS_TMP = $(wildcard *.cpp)
-SRCS_EXCLUDE = CreatePolygonPack.cpp # 
+SRCS_EXCLUDE = CreatePolygonPack.cpp # 除外
 SRCS = $(filter-out $(SRCS_EXCLUDE),$(SRCS_TMP))
 OBJS = $(SRCS:.cpp=.o)