changeset 63:54355e641172

*** empty log message ***
author gongo
date Sun, 17 Feb 2008 10:55:22 +0900
parents b03e4cb64302
children eb2cb212881c
files TaskManager/Cell/CellBufferManager.cc TaskManager/Changelog TaskManager/Test/simple_render/Makefile TaskManager/Test/simple_render/main.cpp TaskManager/Test/simple_render/viewer.cpp TaskManager/kernel/ppe/BufferManager.cc TaskManager/kernel/ppe/HTaskInfo.cc TaskManager/kernel/ppe/TaskManager.cc TaskManager/kernel/ppe/TaskManagerImpl.cc include/TaskManager/BufferManager.h include/TaskManager/CellBufferManager.h include/TaskManager/HTaskInfo.h include/TaskManager/TaskManager.h
diffstat 13 files changed, 156 insertions(+), 72 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Cell/CellBufferManager.cc	Sat Feb 16 21:42:17 2008 +0900
+++ b/TaskManager/Cell/CellBufferManager.cc	Sun Feb 17 10:55:22 2008 +0900
@@ -6,18 +6,13 @@
 void
 CellBufferManager::init(void)
 {
-    tlistImpl  = new CellTaskListInfo;
-    tqueueImpl = new TaskQueueInfo;
-    htaskImpl  = new HTaskInfo;
+    BufferManager::init(void);
 
-    tlistImpl->init(machineNum*2);
-    tqueueImpl->init(TASK_MAX_SIZE*4);
-    htaskImpl->init(TASK_MAX_SIZE*2);
-    
-    machineTaskList = new TaskListPtr[machineNum];
+    cellTaskListImpl = new CellTaskListInfo;
+    machineTaskList  = new TaskListPtr[machineNum];
 
     for (int i = 0; i < machineNum; i++) {
-	machineTaskList[i] = tlistImpl->create();
+	machineTaskList[i] = cellTaskListImpl->create();
     }
 }
 
@@ -27,8 +22,8 @@
 {
     TaskQueuePtr q;
 
-    q = tqueueImpl->create(task);
-    activeTaskQueue = tqueueImpl->append(activeTaskQueue, q);
+    q = taskQueueImpl->create(task);
+    activeTaskQueue = taskQueueImpl->append(activeTaskQueue, q);
 }
 
 void
@@ -36,8 +31,8 @@
 {
     TaskQueuePtr q;
 
-    q = tqueueImpl->create(task);
-    waitTaskQueue = tqueueImpl->append(waitTaskQueue, q);
+    q = taskQueueImpl->create(task);
+    waitTaskQueue = taskQueueImpl->append(waitTaskQueue, q);
 }
 
 TaskListPtr
@@ -52,8 +47,8 @@
     if (list->length < TASK_MAX_SIZE) {
 	return list;
     } else {
-	q = tlistImpl->create();
-	machineTaskList[0] = tlistImpl->append(machineTaskList[0], q);
+	q = cellTaskListImpl->create();
+	machineTaskList[0] = cellTaskListImpl->append(machineTaskList[0], q);
 	return q;
     }
 }
@@ -69,7 +64,7 @@
     while (p) {
 	p1 = p;
 	p = p->next;
-	tlistImpl->free(p1);
+	cellTaskListImpl->free(p1);
     }
 }
 #endif
--- a/TaskManager/Changelog	Sat Feb 16 21:42:17 2008 +0900
+++ b/TaskManager/Changelog	Sun Feb 17 10:55:22 2008 +0900
@@ -1,3 +1,29 @@
+2008-02-17  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
+
+	* fix: kernel/ppe/HTask.cpp
+	今まで、manager->create_task で生成したタスクは
+
+	- dependency の設定
+	manager->set_task_depend(master, slave) // slave は master を待つ
+
+	- 実行キューへの追加
+	manager->spawn_task(master);
+	manager->spawn_task(slave);
+
+	と、manager を介してやっていました。
+	まあそれでもいいんだけど、特に dependency の所は
+	どっちがどっちを待つのかってのは、API見るだけじゃわからない。
+	そこで、Task (HTask のこと) に、上二つに対応するような
+
+	void set_depend(HTaskPtr) と void spawn(void) を追加しました。
+
+	- Usage
+	slave->set_depend(master); // slave は master を待つ
+	slave->spawn(); // slave をキューへ追加
+
+	結局は、それぞれの関数の中では、上の set_task_depend とかを
+	呼んでるんだけど、ユーザ側からするとこの方がわかりやすいと思います。
+
 2008-02-16  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
 
 	* tag: beta3
--- a/TaskManager/Test/simple_render/Makefile	Sat Feb 16 21:42:17 2008 +0900
+++ b/TaskManager/Test/simple_render/Makefile	Sun Feb 17 10:55:22 2008 +0900
@@ -13,9 +13,9 @@
 
 EXTRA_CFLAGS = `sdl-config --cflags` `xml2-config --cflags`\
 
-LIBS = `sdl-config --libs` -lSDL_image -lGL \
+LIBS = `sdl-config --libs` -lSDL_image -Wl,-framework,OpenGL \
        `xml2-config --libs`\
-       -L../../ -lmanager -lspe2 -lpthread
+       -L../../ -lmanager #-lspe2 -lpthread
 
 .SUFFIXES: .cpp .o
 
--- a/TaskManager/Test/simple_render/main.cpp	Sat Feb 16 21:42:17 2008 +0900
+++ b/TaskManager/Test/simple_render/main.cpp	Sun Feb 17 10:55:22 2008 +0900
@@ -44,15 +44,20 @@
     task_zrow_init = manager->create_task(fd_zrow_init, 0, 0, 0, NULL);
     task_run       = manager->create_task(fd_run, 0, 0, 0, NULL);
 
-    manager->set_task_depend(task_sdl_init, task_run);
-    manager->set_task_depend(task_zrow_init, task_run);
+    // obsolute API
+    //manager->set_task_depend(task_sdl_init, task_run);
+    //manager->set_task_depend(task_zrow_init, task_run);
+    task_run->set_depend(task_sdl_init);
+    task_run->set_depend(task_zrow_init);
 
-    //task_sdl_init->set_depend(..);
-    //task_sdl_init->spawn();
+    // obsolute API
+    //manager->spawn_task(task_sdl_init);
+    //manager->spawn_task(task_zrow_init);
+    //manager->spawn_task(task_run);
 
-    manager->spawn_task(task_sdl_init);
-    manager->spawn_task(task_zrow_init);
-    manager->spawn_task(task_run);
+    task_sdl_init->spawn();
+    task_zrow_init->spawn();
+    task_run->spawn();
 
     free(initArg);
     return 0;
@@ -162,7 +167,7 @@
 
     fd_init = manager->open("init");
     task_init  = manager->create_task(fd_init, 0, 0, 0, NULL);
-    manager->spawn_task(task_init);
+    task_init->spawn();
 
     manager->run();
 
--- a/TaskManager/Test/simple_render/viewer.cpp	Sat Feb 16 21:42:17 2008 +0900
+++ b/TaskManager/Test/simple_render/viewer.cpp	Sun Feb 17 10:55:22 2008 +0900
@@ -277,7 +277,8 @@
 
     fd = manager->open("ViewerRunLoop");
     task = manager->create_task(fd, 0, 0, 0, NULL);      
-    manager->spawn_task(task);
+    //manager->spawn_task(task);
+    task->spawn();
 }
 
 void
@@ -297,7 +298,8 @@
 	this_time = get_ticks();
 	fd_finish = manager->open("ViewerRunFinish");
 	task_finish = manager->create_task(fd_finish, 0, 0, 0, NULL);
-	manager->spawn_task(task_finish);
+	//manager->spawn_task(task_finish);
+	task_finish->spawn();
 	return;
     }
 
@@ -317,12 +319,17 @@
 					  sgp_buff, pp_buff, NULL);
     task = manager->create_task(fd, 0, 0, 0, NULL);
 
-    manager->set_task_depend(task_update_sgp, task);
-    manager->set_task_depend(task_create_pp, task);
+    //manager->set_task_depend(task_update_sgp, task);
+    //manager->set_task_depend(task_create_pp, task);
+    task->set_depend(task_update_sgp);
+    task->set_depend(task_create_pp);
 
-    manager->spawn_task(task_update_sgp);
-    manager->spawn_task(task_create_pp);
-    manager->spawn_task(task);
+    //manager->spawn_task(task_update_sgp);
+    //manager->spawn_task(task_create_pp);
+    //manager->spawn_task(task);
+    task_update_sgp->spawn();
+    task_create_pp->spawn();
+    task->spawn();
 
     sgp_buff->swap_buffer();
 }
@@ -345,7 +352,8 @@
 
     fd = manager->open("ViewerRunLoop");
     task = manager->create_task(fd, 0, 0, 0, NULL);
-    manager->spawn_task(task);
+    //manager->spawn_task(task);
+    task->spawn();
 }
 
 void
--- a/TaskManager/kernel/ppe/BufferManager.cc	Sat Feb 16 21:42:17 2008 +0900
+++ b/TaskManager/kernel/ppe/BufferManager.cc	Sun Feb 17 10:55:22 2008 +0900
@@ -10,25 +10,21 @@
 void
 BufferManager::init(void)
 {
-    tlistImpl  = new TaskListInfo;
-    tqueueImpl = new TaskQueueInfo;
-    htaskImpl  = new HTaskInfo;
+    taskListImpl  = new TaskListInfo;
+    taskQueueImpl = new TaskQueueInfo;
+    htaskImpl     = new HTaskInfo;
 
-    tlistImpl->init(machineNum*2);
-    tqueueImpl->init(TASK_MAX_SIZE*4);
+    taskListImpl->init(machineNum*2);
+    taskQueueImpl->init(TASK_MAX_SIZE*4);
     htaskImpl->init(TASK_MAX_SIZE*2);
-    
-    machineTaskList = new TaskListPtr[machineNum];
 
-    for (int i = 0; i < machineNum; i++) {
-	machineTaskList[i] = tlistImpl->create();
-    }
+    mainTaskList = taskListImpl->create();
 }
 
 TaskQueuePtr
 BufferManager::create_taskQueue(HTaskPtr task)
 {
-    return tqueueImpl->create(task);
+    return taskQueueImpl->create(task);
 }
 
 HTaskPtr
@@ -40,7 +36,7 @@
 void
 BufferManager::free_taskQueue(TaskQueuePtr q)
 {
-    tqueueImpl->free(q);
+    taskQueueImpl->free(q);
 }
 
 void
@@ -54,25 +50,33 @@
 {
     TaskQueuePtr q;
 
-    q = tqueueImpl->create(task);
-    activeTaskQueue = tqueueImpl->append(activeTaskQueue, q);
+    q = taskQueueImpl->create(task);
+    activeTaskQueue = taskQueueImpl->append(activeTaskQueue, q);
 }
 
 void
 BufferManager::finish(void)
 {
-    delete tlistImpl;
-    delete tqueueImpl;
+    delete taskListImpl;
+    delete taskQueueImpl;
     delete htaskImpl;
 }
 
+/**
+ * waitTaskList って別で持つ必要あるのかな。
+ * ここでいう wait ってのは依存のことで、
+ * 依存される? task はすでにこの task を持っているわけだから。
+ * わざわざ waitTaskList を持つ必要は無い。
+ * けど、OS とかだと依存とかじゃない wait もあるんだよな。
+ * 消す必要は無いか。
+ */
 void
 BufferManager::append_waitTask(HTaskPtr task)
 {
-    TaskQueuePtr q;
+    //TaskQueuePtr q;
 
-    q = tqueueImpl->create(task);
-    waitTaskQueue = tqueueImpl->append(waitTaskQueue, q);
+    //q = taskQueueImpl->create(task);
+    //waitTaskQueue = taskQueueImpl->append(waitTaskQueue, q);
 }
 
 void
@@ -99,7 +103,7 @@
 	    d = p;
 	    p = p->next;
 	    append_activeTask(task);
-	    waitTaskQueue = remove_taskQueue(waitTaskQueue, d);
+	    //waitTaskQueue = remove_taskQueue(waitTaskQueue, d);
 	} else {
 	    p = p->next;
 	}
@@ -116,7 +120,7 @@
 
     if (p->task == task) {
 	list = list->next;
-	tqueueImpl->free(p);
+	taskQueueImpl->free(p);
     } else {
 	p1 = p->next;
 	while (p1 && p1->task && p1->task != task) {
@@ -125,7 +129,7 @@
 	}
 	if (p1) {
 	    p->next = p1->next;
-	    tqueueImpl->free(p1);
+	    taskQueueImpl->free(p1);
 	}
     }
 
@@ -142,7 +146,7 @@
 
     if (p == q) {
 	list = list->next;
-	tqueueImpl->free(p);
+	taskQueueImpl->free(p);
     } else {
 	p1 = p->next;
 	while (p1 && p1 != q) {
@@ -151,7 +155,7 @@
 	}
 	if (p1) {
 	    p->next = p1->next;
-	    tqueueImpl->free(p1);
+	    taskQueueImpl->free(p1);
 	}
     }
 
@@ -163,15 +167,15 @@
 {
     TaskListPtr list, q;
 
-    list = machineTaskList[0];
+    list = mainTaskList;
 
     while (list->next) list = list->next;
 
     if (list->length < TASK_MAX_SIZE) {
 	return list;
     } else {
-	q = tlistImpl->create();
-	machineTaskList[0] = tlistImpl->append(machineTaskList[0], q);
+	q = taskListImpl->create();
+	mainTaskList = taskListImpl->append(mainTaskList, q);
 	return q;
     }
 }
@@ -181,12 +185,12 @@
 {
     TaskListPtr p, p1;
 
-    machineTaskList[0]->length = 0;
+    mainTaskList->length = 0;
 
-    p = machineTaskList[0]->next;
+    p = mainTaskList->next;
     while (p) {
 	p1 = p;
 	p = p->next;
-	tlistImpl->free(p1);
+	taskListImpl->free(p1);
     }
 }
--- a/TaskManager/kernel/ppe/HTaskInfo.cc	Sat Feb 16 21:42:17 2008 +0900
+++ b/TaskManager/kernel/ppe/HTaskInfo.cc	Sun Feb 17 10:55:22 2008 +0900
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include "TaskManagerImpl.h"
 #include "HTaskInfo.h"
 
 HTaskInfo::HTaskInfo(void)
@@ -62,6 +63,7 @@
     q->wait_me  = NULL;
     q->wait_i   = NULL;
     q->post_func = NULL;
+    q->mimpl     = NULL;
 
     return q;
 }
@@ -83,3 +85,27 @@
     }
     freeHTask = htaskPool = NULL;
 }
+
+
+/**
+ * manager->set_task_depend(task1, task2); // task2 は task1 の終了を待つ
+ *
+ * ってやるより
+ *
+ * task2->set_depend(task1);
+ *
+ * ってやったほうがわかりやすいよねー的な話し合いで
+ * 下のようなAPIを作りました
+ */
+
+void
+HTask::spawn(void)
+{
+    mimpl->spawn_task(this);
+}
+
+void
+HTask::set_depend(HTaskPtr master)
+{
+    mimpl->set_task_depend(master, this);
+}
--- a/TaskManager/kernel/ppe/TaskManager.cc	Sat Feb 16 21:42:17 2008 +0900
+++ b/TaskManager/kernel/ppe/TaskManager.cc	Sun Feb 17 10:55:22 2008 +0900
@@ -58,6 +58,16 @@
     return m_impl->create_task(cmd, size, in, out, func);
 }
 
+/**
+ * TaskManager を介してではなく、
+ * HTask から直接呼べるようにしたので不要に
+ *
+ * obsolute API
+ *   manager->set_task_depend(master, slave);
+ * new API
+ *   slave->set_depend(master);
+ */
+#if 0
 void
 TaskManager::set_task_depend(HTaskPtr master, HTaskPtr slave)
 {
@@ -69,6 +79,7 @@
 {
     m_impl->spawn_task(task);
 }
+#endif
 
 void
 TaskManager::run(void)
@@ -89,7 +100,7 @@
 
     init_fd = open(sym);
     init =  m_impl->create_task(init_fd, 0, 0, 0, 0);
-    spawn_task(init);
+    m_impl->spawn_task(init);
 }
 
 
--- a/TaskManager/kernel/ppe/TaskManagerImpl.cc	Sat Feb 16 21:42:17 2008 +0900
+++ b/TaskManager/kernel/ppe/TaskManagerImpl.cc	Sun Feb 17 10:55:22 2008 +0900
@@ -42,6 +42,8 @@
 	new_task->post_func = func;
     }
 
+    new_task->mimpl = this;
+
     return new_task;
 }
 
@@ -102,13 +104,11 @@
 	// かっこいい class 判定がないものか。typeinfoだっけ?
 	// in,out にあるのが DmaBuffer 以外だったら通信させない決まりにしたい
 	if (htask->in_addr != 0) {
-	    //task->in_addr = (uint32)(htask->in_addr->get_buffer());
 	    htask->in_addr->get_buffer(&task->in_addr);
 	} else {
 	    task->in_addr = 0;
 	}
 	if (htask->in_addr != 0) {
-	    //task->out_addr = (uint32)(htask->out_addr->get_buffer());
 	    htask->out_addr->get_buffer(&task->out_addr);
 	} else {
 	    task->out_addr = 0;
--- a/include/TaskManager/BufferManager.h	Sat Feb 16 21:42:17 2008 +0900
+++ b/include/TaskManager/BufferManager.h	Sun Feb 17 10:55:22 2008 +0900
@@ -32,14 +32,14 @@
     virtual ~BufferManager(void);
     
     /* variables */
-    TaskListInfo *tlistImpl;
-    TaskQueueInfo *tqueueImpl;
+    TaskListInfo *taskListImpl;
+    TaskQueueInfo *taskQueueImpl;
     HTaskInfo *htaskImpl;
 
     int machineNum;
     TaskQueuePtr activeTaskQueue;
     TaskQueuePtr waitTaskQueue;
-    TaskListPtr *machineTaskList;
+    TaskListPtr mainTaskList;
 
     /* function */
     virtual void init(void);
--- a/include/TaskManager/CellBufferManager.h	Sat Feb 16 21:42:17 2008 +0900
+++ b/include/TaskManager/CellBufferManager.h	Sun Feb 17 10:55:22 2008 +0900
@@ -7,6 +7,8 @@
 
 class CellBufferManager : public BufferManager {
 public:
+    TaskListPtr *machineTaskList;
+
     void init(void);
 
 #if 0
--- a/include/TaskManager/HTaskInfo.h	Sat Feb 16 21:42:17 2008 +0900
+++ b/include/TaskManager/HTaskInfo.h	Sun Feb 17 10:55:22 2008 +0900
@@ -13,6 +13,8 @@
 #  include "DmaBuffer.h"
 #endif
 
+class TaskManagerImpl;
+
 struct htask {
     int command;
     int in_size;
@@ -24,6 +26,11 @@
     TaskQueuePtr wait_i;   // List of task for which I am waiting
     void (*post_func)(void);    
     struct htask *next;
+
+    TaskManagerImpl *mimpl;
+    void spawn(void);
+    void set_depend(struct htask *);
+    //void (*set_cpu)(int);
 };
 
 class HTaskInfo {
--- a/include/TaskManager/TaskManager.h	Sat Feb 16 21:42:17 2008 +0900
+++ b/include/TaskManager/TaskManager.h	Sun Feb 17 10:55:22 2008 +0900
@@ -23,8 +23,8 @@
     void finish(void);
     HTaskPtr create_task(int cmd, int siz, DmaBuffer *in_addr,
 			 DmaBuffer *out_addr, void (*func)(void));
-    void set_task_depend(HTaskPtr master, HTaskPtr slave);
-    void spawn_task(HTaskPtr);
+    //void set_task_depend(HTaskPtr master, HTaskPtr slave);
+    //void spawn_task(HTaskPtr);
     void run(void);
 
     void set_init_task(const char *sym);