changeset 8:07fab8c367b2

made src directory and move all source files into it. support autocont and automake tools.
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 08 Jan 2010 14:40:49 +0900
parents 299cc57f332b
children 25b07dc82e8b
files Debug.h Fifo/SchedTask.h Fifo/Scheduler.cbc Fifo/Scheduler.h Fifo/TaskManager.cbc Fifo/TaskManager.h Fifo/TaskManager.o Fifo/interface.h List.c List.h Makefile.am Task.h TaskInterface.cbc TaskManagerAbst.cbc TaskQueue.c examples/treedependtask/Makefile examples/treedependtask/task.def examples/treedependtask/taskinit.cbc examples/treedependtask/taskinit.h examples/treedependtask/testmanager examples/treedependtask/testmanager.cbc src/Debug.h src/Fifo/SchedTask.h src/Fifo/Scheduler.cbc src/Fifo/Scheduler.h src/Fifo/TaskManager.cbc src/Fifo/TaskManager.h src/Fifo/interface.h src/List.c src/List.h src/Makefile.am src/Queue.c src/Queue.h src/Task.h src/TaskInterface.cbc src/TaskManagerAbst.cbc src/TaskQueue.c src/pthread/TaskManager.cbc src/pthread/TaskManager.h src/pthread/ThreadManager.cbc src/taskinit.cbc src/taskinit.h taskinit.cbc taskinit.h test/list/Makefile
diffstat 45 files changed, 1684 insertions(+), 1087 deletions(-) [+]
line wrap: on
line diff
--- a/Debug.h	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#ifndef _DEBUG_H
-#define _DEBUG_H
-
-#ifdef DEBUG
-
-#include <stdio.h>
-
-#define __DEBUG(f, args...) \
-    fprintf(stderr, "in %s: "f, __FUNCTION__, ## args)
-
-#define __DEBUGnoF(f, args...) \
-    fprintf(stderr, f, ## args)
-
-#else
-
-#define __DEBUG(f, args...)
-
-#endif
-
-#endif /* !_DEBUG_H */
--- a/Fifo/SchedTask.h	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-#ifndef _SCHEDTASK_H
-#define _SCHEDTASK_H
-
-#include "user.h"
-#include "Task.h"
-
-typedef struct _SchedTask {
-	Task *task;
-	Taskrun nextcode;
-	void *rbuff;
-	void *wbuff;
-} SchedTask;
-
-#endif /* !_SCHEDTASK_H */
--- a/Fifo/Scheduler.cbc	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-//#include "Task.h"
-#include <stdint.h>
-#include <stdlib.h>
-#include "TaskManager.h"
-#include "List.h"
-
-enum wait{
-	NOWAIT=0,
-	WAIT=1,
-};
-extern __code checkNewCode(TaskScheduler *, enum wait);
-
-__code (*scheduler)(void*,Taskrun,void*,void*);
-
-typedef List SchedTaskList;
-#define addSchedTask(a,b) (SchedTaskList*)_listAddFirst((List*)(a),(void*)(b))
-#define removeTask(a,b) (SchedTaskList*)_listRemove((List*)(a),(void*)(b))
-// inline functionのがいいか
-
-__code schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff);
-
-extern void *allocate(size_t);
-
-#if 0
-__code
-addCode(TaskScheduler *tsched, ID id, Taskrun code0, void *rbuff, void *wbuff)
-{
-	SchedTask *newst;
-	newst = allocate(sizeof(SchedTask)); //これはAbstractLayerで生成してもいいのだが…
-	newst->nextcode = code0;
-	newst->rbuff = rbuff; //taskの遷移で引数が変化しないならいならい
-	newst->wbuff = wbuff;
-
-	/* regist new task to schedtasks list.  */
-	tsched->schedtasks = addSchedTask(tsched->schedtasks, newst);
-
-	goto selectCode(tsched);
-}
-#endif
-
-__code
-selectCode(TaskScheduler *tsched)
-{
-	SchedTask *task;
-	if (tsched->schedtasks) {
-		task = (SchedTask*)_listGetLastData(tsched->schedtasks);
-		tsched->running = task;
-
-		/* goto user-defined task.  */
-		goto task->nextcode(tsched, task->task->rbuff, task->task->wbuff);
-	} else {
-		/* no task we have.  */
-		//goto checkNewCode();
-		goto noCode(tsched);
-	}
-}
-
-__code
-schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff)
-{
-	/* schedulerd  */
-	if ( nextcode==NULL ) {
-		/* the task finished.  */
-		tsched->schedtasks =
-			_listRemove(tsched->schedtasks, tsched->running);
-		tsched->exittasks =
-			_listAddFirst(tsched->exittasks, tsched->running);
-		goto selectCode(tsched);
-		/*
-		ID id = tsched->running->id;
-		tsched->schedtasks =
-			removeTask(tsched->schedtasks, tsched->running);
-		free(tsched->running);
-		tsched->running = NULL;
-		goto exitCode(tsched, id);
-		*/
-	} else {
-		/* save the next code segment for the task.  */
-		tsched->running->nextcode = nextcode;
-		tsched->running->rbuff = rbuff;
-		tsched->running->wbuff = wbuff;
-		/* move last task to first to be fair.  */
-		tsched->schedtasks = _listMoveLasttoFirst(tsched->schedtasks);
-		goto selectCode(tsched, NOWAIT);
-	}
-}
-
-
--- a/Fifo/Scheduler.h	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-#ifndef _TASKSCHEDULER_H
-#define _TASKSCHEDULER_H
-#include <stdint.h>
-#include "List.h"
-#include "Task.h"
-typedef uint32_t ID;
-
-typedef struct _SchedTask {
-	ID id;  // task identifier;
-	Taskrun nextcode;
-	void *rbuff;
-	void *wbuff;
-} SchedTask;
-
-typedef struct _scheduler {
-	SchedTask *running;
-	List *runnable;
-	//Scheduler schedule;
-} TaskScheduler;
-
-
-__code initScheduler(__code (*)(TaskScheduler *,void *), void *);
-__code addCode(TaskScheduler *, ID, Taskrun, void *, void *);
-__code selectCode(TaskScheduler *);
-
-#endif /* _TASKSCHEDULER_H */
--- a/Fifo/TaskManager.cbc	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,188 +0,0 @@
-#include "TaskManager.h"
-#include "Task.h"
-#include "Debug.h"
-
-/* defined in TaskManagerAbst.  */
-extern Task *createTask(int, char *);
-extern void taskSetData(Task*, void*, int, void*, int);
-extern void taskSpawn(TaskManager*, Task*);
-
-/* declarations of code segment.  */
-int main (int argc, char **argv);
-__code startTaskManager ();
-__code searchStartTask (TaskManager *manager);
-__code searchStartTask_1 (TaskManager *manager, int i);
-__code startTask (TaskManager *manager, int i);
-__code executeTask (TaskManager *manager, ListIter *iter, Task *task);
-__code checkEvent (TaskManager *manager);
-__code checkEvent_real (TaskManager *manager);
-__code selectCode (TaskManager *tsched);
-__code schedEntry (TaskManager *tsched, Taskrun nextcode, void *rbuff, void *wbuff);
-
-/* external code segments.  */
-extern __code executed (TaskManager *manager, ListIter *iter, Task *task);
-extern __code finishTask (TaskManager *manager, Task *task);
-extern __code noEvent (TaskManager *manager);
-extern __code searchStartTask(TaskManager *manager);
-
-
-/* for Debug.  */
-void printTasks(TaskManager *manager);
-
-
-/* Global variable for user task.  */
-__code (*scheduler)(TaskManager*, Taskrun, void*, void*);
-
-
-
-
-int
-main(int argc, char **argv)
-{
-	goto startTaskManager();
-}
-
-// TODO: some codes are moved to TaskManagerAbst.
-/*
- *   Initialization
- */
-__code
-startTaskManager()
-{
-	TaskManager *manager;
-	manager = malloc(sizeof(TaskManager));
-	manager->waitingList = NULL;
-	manager->schedTasks = NULL;
-	manager->exitTasks = NULL;
-	manager->running = NULL;
-	scheduler = schedEntry;
-	goto searchStartTask(manager);
-}
-
-__code
-executeTask(TaskManager *manager, ListIter *iter, Task *task)
-{
-	SchedTask *stask;
-	stask = malloc(sizeof(SchedTask));
-	stask->task = task;
-	stask->nextcode = tasktypes[task->typeid].code;
-	stask->rbuff = task->rbuff;
-	stask->wbuff = task->wbuff;
-
-	manager->schedTasks = _listAddFirst(manager->schedTasks, stask);
-	goto executed(manager, iter, task);
-}
-
-__code
-checkEvent(TaskManager *manager)
-{
-	goto selectCode(manager);
-	// to selectCode, run tasks, and return to checkEvent_real.
-}
-__code
-checkEvent_real(TaskManager *manager)
-{
-	SchedTask *stask;
-	Task *task;
-	//printTasks(manager);
-	if (manager->exitTasks) {
-		stask = _listGetnthData(manager->exitTasks, 0);
-		manager->exitTasks = _listRemove(manager->exitTasks, stask);
-		task = stask->task;
-		free(stask);
-		__DEBUG("task[%d] finished.\n", task->id);
-		goto finishTask(manager, task);
-	/*} else if (manager->newtasks) { */
-	} else {
-		goto noEvent(manager);
-	}
-}
-
-__code
-exitTaskManager(TaskManager *manager)
-{
-	__DEBUG("all tasks finished!\n");
-	exit(0);
-}
-
-
-/*
- *  Scheduler
- */
-__code
-selectCode(TaskManager *tsched)
-{
-	SchedTask *task;
-	if (tsched->schedTasks) {
-		task = (SchedTask*)_listGetLastData(tsched->schedTasks);
-		tsched->running = task;
-
-		/* goto user-defined task.  */
-		goto task->nextcode(tsched, task->task->rbuff, task->task->wbuff);
-	} else {
-		/* no task we have.  */
-		//goto checkNewCode();
-		goto checkEvent_real(tsched);
-	}
-}
-
-__code
-schedEntry(TaskManager *tsched, Taskrun nextcode, void *rbuff, void *wbuff)
-{
-	/* schedulerd  */
-	if ( nextcode==NULL ) {
-		/* the task finished.  */
-		tsched->schedTasks =
-			_listRemove(tsched->schedTasks, tsched->running);
-		tsched->exitTasks =
-			_listAddFirst(tsched->exitTasks, tsched->running);
-		goto selectCode(tsched);
-	} else {
-		/* save the next code segment for the task.  */
-		tsched->running->nextcode = nextcode;
-		tsched->running->rbuff = rbuff;
-		tsched->running->wbuff = wbuff;
-		/* move last task to first to be fair.  */
-		tsched->schedTasks = _listMoveLasttoFirst(tsched->schedTasks);
-		goto selectCode(tsched);
-	}
-}
-
-
-
-/*
- *  for Debug.
- */
-void
-printTasks(TaskManager *manager)
-{
-	Task *task;
-	SchedTask *stask;
-	ListIter *iter;
-	__DEBUG("waiting:\n\t");
-	iter = _listIterator(manager->waitingList);
-	while ( (task=_listIterNext(iter))!=NULL ) {
-		__DEBUGnoF("%d, ", task->id);
-	}
-	__DEBUGnoF("\n");
-	_listIterEnd(iter);
-
-	__DEBUG("scheduled:\n\t");
-	iter = _listIterator(manager->schedTasks);
-	while ( (stask=_listIterNext(iter))!=NULL ) {
-		__DEBUGnoF("%d, ", stask->task->id);
-	}
-	__DEBUGnoF("\n");
-	_listIterEnd(iter);
-
-	__DEBUG("exit:\n\t");
-	iter = _listIterator(manager->exitTasks);
-	while ( (stask=_listIterNext(iter))!=NULL ) {
-		__DEBUGnoF("%d, ", stask->task->id);
-	}
-	__DEBUGnoF("\n");
-	_listIterEnd(iter);
-}
-
-
-
--- a/Fifo/TaskManager.h	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-#ifndef _TASKMANAGER_H
-#define _TASKMANAGER_H
-#include <stdlib.h>
-#include "List.h"
-#include "Task.h"
-#include "interface.h"
-
-typedef struct _SchedTask {
-	Task *task;
-	Taskrun nextcode;
-	void *rbuff;
-	void *wbuff;
-} SchedTask;
-
-typedef struct _TaskManager {
-	List *waitingList;  // list of tasks waiting for others.
-	List *activeList;
-	List *schedTasks;	// list of schedtasks executing now.
-	List *exitTasks;	// list of schedtasks which finished.
-	SchedTask *running;
-} TaskManager;
-
-#endif /* !_TASKMANAGER_H */
Binary file Fifo/TaskManager.o has changed
--- a/Fifo/interface.h	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-#ifndef _INTERFACE_H
-#define _INTERFACE_H
-// included by user.
-
-typedef __code (*Taskrun)(void*, void*, void*);
-//extern __code (*scheduler)(void*,Taskrun,void*,void*);
-
-#define ENDTASK ((Taskrun)NULL)
-
-#endif /* _INTERFACE_H */
-
-
--- a/List.c	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-#include<stdlib.h>
-/* TODO: malloc.  */
-#include"List.h"
-
-/*
- *  doubly-linked list.
- *  interfaces of these routines is based on glib.
- *
- *  Usage:
- *  create new list.
- *  	list = NULL
- *  add new data
- *  	list = _listAddFirst(list, data)
- *  remove data from the list
- *  	list = _listRemove(list, data)
- *  get n-th data
- *  	data = _listGetnthData(list, n)
- *
- *
- *  NOTE:
- *  Although `struct List' is a doubly-linked List, the List
- *  is made as a Ring.  An User's variable is treated as a
- *  head of the list.  And head->prev is last.  And then if
- *  list have only one data, both next and prev field of
- *  head will point to oneself.
- *  If the variable is NULL, it means no data.
- */
-
-List *
-_listAddFirst(List* top, void *data)
-{
-	List *newlist;
-	List *last;
-	newlist = malloc(sizeof(struct _List));
-	newlist->data = data;
-
-	if (!top) {
-		newlist->next = newlist;
-		newlist->prev = newlist;
-		return newlist;
-	}
-	last = top->prev;
-	newlist->next = top;
-	newlist->prev = last;
-
-	top->prev = newlist;
-	last->next = newlist;
-	return newlist;
-}
-
-List *
-_listRemove(List *top, void *data)
-{
-	List *t;
-	if (top->data==data) {
-		if (top->next==top) {
-			free(top);
-			return NULL;
-		}
-		List *newtop = top->next;
-		top->next->prev = top->prev;
-		top->prev->next = top->next;
-		free(top);
-		return newtop;
-	}
-	for (t=top->next; t!=top; t=t->next) {
-		if (t->data==data) {
-			t->next->prev = t->prev;
-			t->prev->next = t->next;
-			free(t);
-			return top;
-		}
-	}
-	return top;
-}
-
-void *
-_listGetnthData(List *top, int n)
-{
-	List *t;
-
-	for (t=top; n>0; n--) {
-		t = t->next;
-		if (t==top) return NULL;
-	}
-
-	return t->data;
-}
-void *
-_listGetLastData(List *top)
-{
-	if (!top) return NULL;
-	return top->prev->data;
-}
-
-List *
-_listMoveLasttoFirst(List *top)
-{
-	if (!top) return NULL;
-	return top->prev;
-}
-
-void
-_listApply(List *top, ApplyFn fn, void *arg)
-{
-	List *t = top;
-	do {
-		fn(t->data, arg);
-		t = t->next;
-	} while ( t!=top );
-}
-
-/*
- *  Iterator's functions.
- *
- *  iter = _listIterator(list);
- *  while ( (data=_listIterNext(iter)!=NULL ) {
- *  	exe(data);
- *  	if (data...) {
- *  		list = _listIterRemove(iter);
- *  	}
- *  }
- */
-ListIter *
-_listIterator(List *top)
-{
-	ListIter *iter;
-	iter = malloc(sizeof(struct _ListIter));
-	iter->head = top;
-	iter->next = top;
-	return iter;
-}
-
-void *
-_listIterNext(ListIter *iter)
-{
-	void *rtn;
-	if (!iter->next) return NULL;
-
-	rtn = iter->next->data;
-	iter->next = iter->next->next;
-	if (iter->next==iter->head) {
-		iter->next = NULL;
-	}
-	return rtn;
-}
-
-void
-_listIterEnd(ListIter *iter)
-{
-	free(iter);
-}
-
-List *
-_listIterRemoveCurrent(ListIter *iter)
-{
-	List *cur;
-	if (!iter->head) return NULL;
-	else if (!iter->next) cur = iter->head->prev;
-	else cur = iter->next->prev;
-
-	if (cur==iter->head) {
-		if (cur->next==iter->head) {
-			free(iter->head);
-			return NULL;
-		}
-		iter->head = iter->head->next;
-	}
-	cur->prev->next = cur->next;
-	cur->next->prev = cur->prev;
-
-	free(cur);
-	return iter->head;
-}
-
-
-/*
- *  for DEBUG
- */
-
-int
-_listRingCheck(List *head)
-{
-	List *cur = head;
-
-	if (cur->prev->next!=cur) return 0;
-	if (cur->next->prev!=cur) return 0;
-	do {
-		if (cur->prev->next!=cur) return 0;
-		if (cur->next->prev!=cur) return 0;
-		cur = cur->prev;
-	} while (cur!=head);
-
-	if (cur->prev->next!=cur) return 0;
-	if (cur->next->prev!=cur) return 0;
-	cur = cur->next;
-	if (cur->prev->next!=cur) return 0;
-	if (cur->next->prev!=cur) return 0;
-
-	return 1;
-}
-
--- a/List.h	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-#ifndef _LIST_H
-#define _LIST_H
-
-typedef struct _List {
-	void *data;
-	struct _List *next;
-	struct _List *prev;
-} List;
-
-typedef struct _ListIter {
-	struct _List *head;
-	struct _List *next;
-} ListIter;
-
-List * _listAddFirst(List*, void *);
-List * _listRemove(List *, void *);
-void * _listGetnthData(List *, int);
-void * _listGetLastData(List *);
-List * _listMoveLasttoFirst(List *);
-
-typedef int (*ApplyFn)(void*,void*);
-void _listApply(List *, ApplyFn, void *);
-
-
-ListIter * _listIterator(List *);
-void * _listIterNext(ListIter *);
-void _listIterEnd(ListIter *);
-List * _listIterRemoveCurrent(ListIter *);
-
-
-#endif /* !_LIST_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Makefile.am	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,2 @@
+AUTOMAKE_OPTIONS = foreign
+SUBDIRS = src
--- a/Task.h	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-#ifndef _TASK_H
-#define _TASK_H
-// included by user.
-
-#include "List.h"
-#include "interface.h"
-
-
-#define F_NONE 0x000
-#define F_STARTER 0x001
-#define F_a 0x002
-#define F_b 0x004
-
-typedef struct _TaskType {
-	Taskrun code;
-	char *name;
-	unsigned int flag; // F_STARTER ..
-} TaskType;
-
-
-/* defined by user automatically.  */
-extern const TaskType tasktypes[];
-extern const int max_tasktype;
-
-enum cpu {
-	ANY = 0, // not implemented yet.
-	MAIN,
-	SUB,
-};
-
-/* C++CeriumでのHTaskにあたるのかな  */
-typedef struct _Task {
-	char *name;		// task name.
-	int typeid;		// index of tasktypes array.
-	int id;			// task identifier.
-
-	void *rbuff;
-	void *wbuff;
-	int rsize;
-	int wsize;
-	List *waiter;	// List of tasks waiting for me :-P
-	List *waitee;	// List of tasks keep me waiting :-(
-
-	enum cpu cpu;
-} Task;
-
-
-/* user interfaces.  */
-extern Task * createTask (int, char *);
-extern void taskSetData (Task *, void *, int, void *, int);
-extern void taskSetWait (Task *, Task *);
-
-#endif /* _TASK_H */
-
--- a/TaskInterface.cbc	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-#include "TaskManager.h"
-#include "TaskScheduler.h"
-#include "taskinit.h"
-
-extern AbstractLayer *ablayer;
-
-Task *
-createTask(int id, char *name)
-{
-	Task *task;
-	if (!name) name = "(no name)";
-
-	task = malloc(sizeof(Task));
-	task->id = id;
-	task->rbuff = NULL;
-	task->wbuff = NULL;
-	task->waiter = NULL;
-	task->waitee = NULL;
-	task->name = name;
-	task->cpu = ANY;
-	task->rsize = 0;
-	task->wsize = 0;
-
-	return task;
-}
-
-void
-taskSetData(Task *task, void *rbuff, int rsize, void *wbuff, int wsize)
-{
-	task->rbuff = rbuff;
-	task->wbuff = wbuff;
-	task->rsize = rsize;
-	task->wsize = wsize;
-}
-
-void
-taskSetWait(Task *task_a, Task *task_b)
-{
-	/* set a waiting for b.  */
-	a->waitee = _listAddFirst(a->waitee, b);
-	b->waiter = _listAddFirst(b->waiter, a);
-}
-
-void
-taskSpawn(Task *task)
-{
-	//tm->waitingList = _listAddFirst(tm->waitingList, task);
-	ablayer->spawnedTasks = _listAddFirst(ablayer->spawnedTasks, task);
-	return ;
-}
-
-
--- a/TaskManagerAbst.cbc	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,233 +0,0 @@
-#include <assert.h>
-#include "TaskManager.h"
-#include "Task.h"
-#include "List.h"
-// TODO: malloc
-
-extern __code checkEvent(TaskManager *);
-extern __code executeTask(TaskManager*, ListIter*, Task*);
-extern __code exitTaskManager(TaskManager*);
-
-typedef List TaskList;
-
-/*
- * TaskManager's main loop.
- *
- *   while (1) {
- *   	while switch checkEvent() {
- *   	newTask:
- *   		add task to waiting.
- *   	finishTask:
- *   		remove task from active.
- *   	}
- *   	foreach task in waitinglist {
- *   		if (!task_has_waitee) {
- *   			move task to active from waiting.
- *   			executeTask(task)
- *   		}
- *   	}
- *   }
- */
-
-/* declarations  */
-__code initTaskManager (__code(*ret)(TaskManager*,void*), void *arg);
-__code start (TaskManager *manager);
-__code addNewTask (TaskManager *manager, Task *task);
-__code finishTask (TaskManager *manager, Task *task);
-__code noEvent (TaskManager *manager);
-__code getTask (TaskManager *manager, ListIter *iter);
-__code executed (TaskManager *manager, ListIter *iter, Task *task);
-__code cannotExecute (TaskManager *manager, Task *task);
-__code finishTask_1 (TaskManager *manager, Task *task);
-__code finishTask_iter (TaskManager *manager, Task *task, ListIter *iter);
-__code finishTask_end (TaskManager *manager, Task *task);
-void setData (Task *task, void *rbuff, size_t rs, void *wbuff, size_t ws);
-__code searchStartTask(TaskManager *manager);
-__code searchStartTask_1(TaskManager *manager, int i);
-__code startTask(TaskManager *manager, int i);
-
-__code
-initTaskManager(__code(*ret)(TaskManager*,void*), void *arg)
-{
-	TaskManager *manager;
-	manager = malloc(sizeof(TaskManager));
-	goto ret(manager, arg);
-}
-
-/*
- *  Start first task
- */
-__code
-searchStartTask(TaskManager *manager)
-{
-	int i=0;
-	goto searchStartTask_1(manager, i);
-}
-__code
-searchStartTask_1(TaskManager *manager, int i)
-{
-	if (tasktypes[i].flag & F_STARTER ) {
-		goto startTask(manager, i);
-	} else {
-		goto searchStartTask_1(manager, i+1);
-	}
-}
-__code
-startTask(TaskManager *manager, int i)
-{
-	Task *task;
-	task = createTask(i, "start task");
-	taskSetData(task, NULL, 0, NULL, 0);
-	taskSpawn(manager, task);
-
-	goto checkEvent(manager);
-}
-
-
-__code
-start(TaskManager *manager)
-{
-	goto checkEvent(manager);
-}
-__code
-addNewTask(TaskManager *manager, Task *task)
-{
-	manager->waitingList = _listAddFirst(manager->waitingList, task);
-	goto start(manager);
-}
-
-__code
-finishTask(TaskManager *manager, Task *task)
-{
-	goto finishTask_1(manager, task);
-}
-
-__code
-noEvent(TaskManager *manager)
-{
-	ListIter *iter;
-	if (!manager->waitingList && !manager->activeList)
-		goto exitTaskManager(manager);
-	iter = _listIterator(manager->waitingList);
-	goto getTask(manager, iter);
-}
-
-__code
-getTask(TaskManager *manager, ListIter *iter)
-{
-	Task *task;
-	task = (Task*)_listIterNext(iter);
-	if (!task)
-		/* iteration finished.  */
-		goto start(manager);
-	if (task->waitee)
-		/* the task has been waiting yet.  */
-		goto getTask(manager, iter);
-	else
-		/* the task is ready!  */
-		goto executeTask(manager, iter, task);
-}
-
-__code
-executed(TaskManager *manager, ListIter *iter, Task *task)
-{
-	manager->waitingList = _listIterRemoveCurrent(iter);
-	manager->activeList = _listAddFirst(manager->activeList, task);
-	goto getTask(manager, iter);
-}
-/*
-__code cannotExecute(TaskManager *manager, Task *task) { }
-*/
-
-
-__code
-finishTask_1(TaskManager *manager, Task *task)
-{
-	ListIter *iter;
-
-	manager->activeList = _listRemove(manager->activeList, task);
-	iter = _listIterator(task->waiter);
-	goto finishTask_iter(manager, task, iter);
-}
-
-__code
-finishTask_iter(TaskManager *manager, Task *task, ListIter *iter)
-{
-	Task *waiter;
-	waiter = _listIterNext(iter);
-	if (waiter) {
-		waiter->waitee = _listRemove(waiter->waitee, task);
-		task->waiter = _listIterRemoveCurrent(iter);
-		goto finishTask_iter(manager, task, iter);
-	} else {
-		_listIterEnd(iter);
-		goto finishTask_end(manager, task);
-	}
-}
-
-__code
-finishTask_end(TaskManager *manager, Task *task)
-{
-	/* TODO: free(task)  */
-	assert (!task->waiter);
-	assert (!task->waitee);
-	free(task);
-	goto start(manager);
-}
-
-
-
-/*
- * belows is Interfaces for Users.
- * it may be  to code segment.  but how?
- * And it may be moved to AbstractLayer.
- * Now, a task cannot create other tasks on remote host.
- */
-
-Task *
-createTask(int typeid, char *name)
-{
-	static int id=0;
-	Task *task;
-	if (!name) name = "(no name)";
-
-	task = malloc(sizeof(Task));
-	task->typeid = typeid;
-	task->id = id++;
-	task->rbuff = NULL;
-	task->wbuff = NULL;
-	task->waiter = NULL;
-	task->waitee = NULL;
-	task->name = name;
-	task->cpu = ANY;
-	task->rsize = 0;
-	task->wsize = 0;
-
-	return task;
-}
-
-void
-taskSetData(Task *task, void *rbuff, int rsize, void *wbuff, int wsize)
-{
-	task->rbuff = rbuff;
-	task->wbuff = wbuff;
-	task->rsize = rsize;
-	task->wsize = wsize;
-}
-
-void
-taskSetWait(Task *task_a, Task *task_b)
-{
-	/* set a waiting for b.  */
-	task_a->waitee = _listAddFirst(task_a->waitee, task_b);
-	task_b->waiter = _listAddFirst(task_b->waiter, task_a);
-}
-
-void
-taskSpawn(TaskManager *manager, Task *task)
-{
-	manager->waitingList = _listAddFirst(manager->waitingList, task);
-	//ablayer->spawnedTasks = _listAddFirst(ablayer->spawnedTasks, task);
-	return ;
-}
-
--- a/TaskQueue.c	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-#include <stdlib.h>
-// TODO: malloc
-#include "List.h"
-#include "Queue.h"
-
-typedef struct _Queue {
-	List *head;
-	List *tail;
-	int length;
-} Queue;
-
-Queue *
-newQueue()
-{
-	Queue *queue;
-	malloc(sizeof(struct _Queue));
-	queue->head = NULL;
-	queue->tail = NULL;
-	queue->length = 0;
-	return queue;
-}
-
-void
-_QaddFirst(Queue *queue, void *)
-{
-	List *oldhead = queue->head;
-	List *newlist;
-	newlist = malloc(sizeof(struct _List));
-
-	if (oldhead) {
-		oldhead->prev = newlist;
-	}
-	newlist->next = oldhead;
-	newlist->prev = NULL;
-	queue->head = newlist;
-	queue->length++;
-	return ;
-}
-
-void
-_QaddLast(Queue *queue, void *task)
-{
-	List *oldtail = queue->tail;
-	List *newlist;
-	newlist = malloc(sizeof(struct _List));
-
-	if (oldtail) {
-		oldtail->next = newlist;
-	}
-	newlist->next = NULL;
-	newlist->prev = oldtail;
-	queue->tail = newlist;
-	queue->length++;
-	return ;
-}
-
-void *
-_QpollFirst(Queue *queue)
-{
-	List *first = queue->head;
-	List *second;
-	void *task;
-	if (!first) return NULL;
-
-	second = first->next;
-	task = first->task;
-	free(first);
-
-	second->prev = NULL;
-	queue->head = second;
-	queue->length--;
-	return task;
-}
-
-void *
-_QpollLast(Queue *queue)
-{
-	List *first = queue->tail;
-	List *second;
-	void *task;
-	if (!first) return NULL;
-
-	second = first->prev;
-	task = first->task;
-	free(first);
-
-	second->next = NULL;
-	queue->tail = second;
-	queue->length--;
-	return task;
-}
-
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/treedependtask/Makefile	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,32 @@
+#CC = gcc
+CbCC = ~/WorkSpace/Mercurial/build_cbc44/INSTALL_DIR/bin/gcc 
+CC = $(CbCC)
+
+TaskManagerDir = ../../CbCTaskManager
+
+LDFLAGS = -L$(TaskManagerDir)
+LIBS = -lFifoManager
+
+ENVIRONMENT=Fifo
+#ENVIRONMENT=Cell
+
+INCLUDE = -I$(TaskManagerDir) -I$(TaskManagerDir)/user -I. -I$(TaskManagerDir)/$(ENVIRONMENT)
+CFLAGS = -Wall -g -O0 $(INCLUDE) -DDEBUG
+
+.SUFFIXES: .cbc .c .o
+
+all: testmanager
+
+.c.o:
+	$(CC) -c $(CFLAGS) -o $@ $^
+.cbc.o:
+	$(CbCC) -c $(CFLAGS) -o $@ $^
+
+testmanager: testmanager.o taskinit.o
+	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
+
+clean:
+	rm -f *.o testmanager
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/treedependtask/task.def	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,8 @@
+
+/* DEFINETASK(TASK, code, "tasktype name", CPU_TYPE) */
+
+
+DEFINETASKTYPE(StartTASK,	starttask,	"start task",	F_STARTER)
+DEFINETASKTYPE(TASK_A,	taskA,	"task A",	F_NONE)
+DEFINETASKTYPE(TASK_B,	taskB,	"task B",	F_NONE)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/treedependtask/taskinit.cbc	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,1 @@
+../../src/taskinit.cbc
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/treedependtask/taskinit.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,1 @@
+../../src/taskinit.h
\ No newline at end of file
Binary file examples/treedependtask/testmanager has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/treedependtask/testmanager.cbc	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,76 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "CbCTaskManager.h"
+#include "taskinit.h"
+
+#define __DEBUG(f, args...) \
+	fprintf(stderr, "in %s: "f, __FUNCTION__, ## args)
+
+
+
+
+/* it may be moved to TaskManager side.  */
+__code nojob(void *manager, void *rbuff, void *wbuff)
+{
+	goto scheduler(manager, ENDTASK, NULL, NULL);
+}
+
+
+extern __code taskA_0(UserManager *, void *, void *);
+extern __code taskA_1(UserManager *, void *, void *);
+extern __code taskA_2(UserManager *, void *, void *);
+
+
+#define NUM 16
+
+/*
+ *  TASKs.
+ */
+__code starttask(UserManager *manager, void *rbuff, void *wbuff)
+{
+	UserTask *tasks[NUM];
+	__DEBUG("s=%p, rb=%p, wb=%p\n", manager, rbuff, wbuff);
+	int i;
+	for (i=0; i<NUM; i++) {
+		tasks[i] = createTask(TASK_A, NULL);
+		taskSetData(tasks[i], (void*)i, i, NULL,0);
+	}
+	taskSetWait(tasks[0], tasks[1]);
+	for (i=1; 2*i<NUM; i++) {
+		taskSetWait(tasks[i], tasks[2*i]);
+		if (2*i+1<NUM)
+			taskSetWait(tasks[i], tasks[2*i+1]);
+	}
+	for (i=0; i<NUM; i++) {
+		taskSpawn(manager, tasks[i]);
+	}
+	goto scheduler(manager, ENDTASK, NULL, NULL);
+}
+
+__code taskA(UserManager *manager, void *rbuff, void *wbuff)
+{
+	__DEBUG("s=%p, rb=%p, wb=%p\n", manager, rbuff, wbuff);
+	goto scheduler(manager, taskA_0, NULL, NULL);
+}
+__code taskA_0(UserManager *manager, void *rbuff, void *wbuff)
+{
+	__DEBUG("s=%p, rb=%p, wb=%p\n", manager, rbuff, wbuff);
+	goto scheduler(manager, taskA_1, NULL, NULL);
+}
+__code taskA_1(UserManager *manager, void *rbuff, void *wbuff)
+{
+	__DEBUG("s=%p, rb=%p, wb=%p\n", manager, rbuff, wbuff);
+	goto scheduler(manager, taskA_2, NULL, NULL);
+}
+__code taskA_2(UserManager *manager, void *rbuff, void *wbuff)
+{
+	__DEBUG("s=%p, rb=%p, wb=%p\n", manager, rbuff, wbuff);
+	goto scheduler(manager, ENDTASK, NULL, NULL);
+}
+
+__code taskB(UserManager *manager, void *rbuff, void *wbuff)
+{
+	__DEBUG("s=%p, rb=%p, wb=%p\n", manager, rbuff, wbuff);
+	goto scheduler(manager, taskA_0, NULL, NULL);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Debug.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,20 @@
+#ifndef _DEBUG_H
+#define _DEBUG_H
+
+#ifdef DEBUG
+
+#include <stdio.h>
+
+#define __DEBUG(f, args...) \
+    fprintf(stderr, "in %s: "f, __FUNCTION__, ## args)
+
+#define __DEBUGnoF(f, args...) \
+    fprintf(stderr, f, ## args)
+
+#else
+
+#define __DEBUG(f, args...)
+
+#endif
+
+#endif /* !_DEBUG_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Fifo/SchedTask.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,14 @@
+#ifndef _SCHEDTASK_H
+#define _SCHEDTASK_H
+
+#include "user.h"
+#include "Task.h"
+
+typedef struct _SchedTask {
+	Task *task;
+	Taskrun nextcode;
+	void *rbuff;
+	void *wbuff;
+} SchedTask;
+
+#endif /* !_SCHEDTASK_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Fifo/Scheduler.cbc	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,88 @@
+//#include "Task.h"
+#include <stdint.h>
+#include <stdlib.h>
+#include "TaskManager.h"
+#include "List.h"
+
+enum wait{
+	NOWAIT=0,
+	WAIT=1,
+};
+extern __code checkNewCode(TaskScheduler *, enum wait);
+
+__code (*scheduler)(void*,Taskrun,void*,void*);
+
+typedef List SchedTaskList;
+#define addSchedTask(a,b) (SchedTaskList*)_listAddFirst((List*)(a),(void*)(b))
+#define removeTask(a,b) (SchedTaskList*)_listRemove((List*)(a),(void*)(b))
+// inline functionのがいいか
+
+__code schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff);
+
+extern void *allocate(size_t);
+
+#if 0
+__code
+addCode(TaskScheduler *tsched, ID id, Taskrun code0, void *rbuff, void *wbuff)
+{
+	SchedTask *newst;
+	newst = allocate(sizeof(SchedTask)); //これはAbstractLayerで生成してもいいのだが…
+	newst->nextcode = code0;
+	newst->rbuff = rbuff; //taskの遷移で引数が変化しないならいならい
+	newst->wbuff = wbuff;
+
+	/* regist new task to schedtasks list.  */
+	tsched->schedtasks = addSchedTask(tsched->schedtasks, newst);
+
+	goto selectCode(tsched);
+}
+#endif
+
+__code
+selectCode(TaskScheduler *tsched)
+{
+	SchedTask *task;
+	if (tsched->schedtasks) {
+		task = (SchedTask*)_listGetLastData(tsched->schedtasks);
+		tsched->running = task;
+
+		/* goto user-defined task.  */
+		goto task->nextcode(tsched, task->task->rbuff, task->task->wbuff);
+	} else {
+		/* no task we have.  */
+		//goto checkNewCode();
+		goto noCode(tsched);
+	}
+}
+
+__code
+schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff)
+{
+	/* schedulerd  */
+	if ( nextcode==NULL ) {
+		/* the task finished.  */
+		tsched->schedtasks =
+			_listRemove(tsched->schedtasks, tsched->running);
+		tsched->exittasks =
+			_listAddFirst(tsched->exittasks, tsched->running);
+		goto selectCode(tsched);
+		/*
+		ID id = tsched->running->id;
+		tsched->schedtasks =
+			removeTask(tsched->schedtasks, tsched->running);
+		free(tsched->running);
+		tsched->running = NULL;
+		goto exitCode(tsched, id);
+		*/
+	} else {
+		/* save the next code segment for the task.  */
+		tsched->running->nextcode = nextcode;
+		tsched->running->rbuff = rbuff;
+		tsched->running->wbuff = wbuff;
+		/* move last task to first to be fair.  */
+		tsched->schedtasks = _listMoveLasttoFirst(tsched->schedtasks);
+		goto selectCode(tsched, NOWAIT);
+	}
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Fifo/Scheduler.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,26 @@
+#ifndef _TASKSCHEDULER_H
+#define _TASKSCHEDULER_H
+#include <stdint.h>
+#include "List.h"
+#include "Task.h"
+typedef uint32_t ID;
+
+typedef struct _SchedTask {
+	ID id;  // task identifier;
+	Taskrun nextcode;
+	void *rbuff;
+	void *wbuff;
+} SchedTask;
+
+typedef struct _scheduler {
+	SchedTask *running;
+	List *runnable;
+	//Scheduler schedule;
+} TaskScheduler;
+
+
+__code initScheduler(__code (*)(TaskScheduler *,void *), void *);
+__code addCode(TaskScheduler *, ID, Taskrun, void *, void *);
+__code selectCode(TaskScheduler *);
+
+#endif /* _TASKSCHEDULER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Fifo/TaskManager.cbc	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,188 @@
+#include "TaskManager.h"
+#include "Task.h"
+#include "Debug.h"
+
+/* defined in TaskManagerAbst.  */
+extern Task *createTask(int, char *);
+extern void taskSetData(Task*, void*, int, void*, int);
+extern void taskSpawn(TaskManager*, Task*);
+
+/* declarations of code segment.  */
+int main (int argc, char **argv);
+__code startTaskManager ();
+__code searchStartTask (TaskManager *manager);
+__code searchStartTask_1 (TaskManager *manager, int i);
+__code startTask (TaskManager *manager, int i);
+__code executeTask (TaskManager *manager, ListIter *iter, Task *task);
+__code checkEvent (TaskManager *manager);
+__code checkEvent_real (TaskManager *manager);
+__code selectCode (TaskManager *tsched);
+__code schedEntry (TaskManager *tsched, Taskrun nextcode, void *rbuff, void *wbuff);
+
+/* external code segments.  */
+extern __code executed (TaskManager *manager, ListIter *iter, Task *task);
+extern __code finishTask (TaskManager *manager, Task *task);
+extern __code noEvent (TaskManager *manager);
+extern __code searchStartTask(TaskManager *manager);
+
+
+/* for Debug.  */
+void printTasks(TaskManager *manager);
+
+
+/* Global variable for user task.  */
+__code (*scheduler)(TaskManager*, Taskrun, void*, void*);
+
+
+
+
+int
+main(int argc, char **argv)
+{
+	goto startTaskManager();
+}
+
+// TODO: some codes are moved to TaskManagerAbst.
+/*
+ *   Initialization
+ */
+__code
+startTaskManager()
+{
+	TaskManager *manager;
+	manager = malloc(sizeof(TaskManager));
+	manager->waitingList = NULL;
+	manager->schedTasks = NULL;
+	manager->exitTasks = NULL;
+	manager->running = NULL;
+	scheduler = schedEntry;
+	goto searchStartTask(manager);
+}
+
+__code
+executeTask(TaskManager *manager, ListIter *iter, Task *task)
+{
+	SchedTask *stask;
+	stask = malloc(sizeof(SchedTask));
+	stask->task = task;
+	stask->nextcode = tasktypes[task->typeid].code;
+	stask->rbuff = task->rbuff;
+	stask->wbuff = task->wbuff;
+
+	manager->schedTasks = _listAddFirst(manager->schedTasks, stask);
+	goto executed(manager, iter, task);
+}
+
+__code
+checkEvent(TaskManager *manager)
+{
+	goto selectCode(manager);
+	// to selectCode, run tasks, and return to checkEvent_real.
+}
+__code
+checkEvent_real(TaskManager *manager)
+{
+	SchedTask *stask;
+	Task *task;
+	//printTasks(manager);
+	if (manager->exitTasks) {
+		stask = _listGetnthData(manager->exitTasks, 0);
+		manager->exitTasks = _listRemove(manager->exitTasks, stask);
+		task = stask->task;
+		free(stask);
+		__DEBUG("task[%d] finished.\n", task->id);
+		goto finishTask(manager, task);
+	/*} else if (manager->newtasks) { */
+	} else {
+		goto noEvent(manager);
+	}
+}
+
+__code
+exitTaskManager(TaskManager *manager)
+{
+	__DEBUG("all tasks finished!\n");
+	exit(0);
+}
+
+
+/*
+ *  Scheduler
+ */
+__code
+selectCode(TaskManager *tsched)
+{
+	SchedTask *task;
+	if (tsched->schedTasks) {
+		task = (SchedTask*)_listGetLastData(tsched->schedTasks);
+		tsched->running = task;
+
+		/* goto user-defined task.  */
+		goto task->nextcode(tsched, task->task->rbuff, task->task->wbuff);
+	} else {
+		/* no task we have.  */
+		//goto checkNewCode();
+		goto checkEvent_real(tsched);
+	}
+}
+
+__code
+schedEntry(TaskManager *tsched, Taskrun nextcode, void *rbuff, void *wbuff)
+{
+	/* schedulerd  */
+	if ( nextcode==NULL ) {
+		/* the task finished.  */
+		tsched->schedTasks =
+			_listRemove(tsched->schedTasks, tsched->running);
+		tsched->exitTasks =
+			_listAddFirst(tsched->exitTasks, tsched->running);
+		goto selectCode(tsched);
+	} else {
+		/* save the next code segment for the task.  */
+		tsched->running->nextcode = nextcode;
+		tsched->running->rbuff = rbuff;
+		tsched->running->wbuff = wbuff;
+		/* move last task to first to be fair.  */
+		tsched->schedTasks = _listMoveLasttoFirst(tsched->schedTasks);
+		goto selectCode(tsched);
+	}
+}
+
+
+
+/*
+ *  for Debug.
+ */
+void
+printTasks(TaskManager *manager)
+{
+	Task *task;
+	SchedTask *stask;
+	ListIter *iter;
+	__DEBUG("waiting:\n\t");
+	iter = _listIterator(manager->waitingList);
+	while ( (task=_listIterNext(iter))!=NULL ) {
+		__DEBUGnoF("%d, ", task->id);
+	}
+	__DEBUGnoF("\n");
+	_listIterEnd(iter);
+
+	__DEBUG("scheduled:\n\t");
+	iter = _listIterator(manager->schedTasks);
+	while ( (stask=_listIterNext(iter))!=NULL ) {
+		__DEBUGnoF("%d, ", stask->task->id);
+	}
+	__DEBUGnoF("\n");
+	_listIterEnd(iter);
+
+	__DEBUG("exit:\n\t");
+	iter = _listIterator(manager->exitTasks);
+	while ( (stask=_listIterNext(iter))!=NULL ) {
+		__DEBUGnoF("%d, ", stask->task->id);
+	}
+	__DEBUGnoF("\n");
+	_listIterEnd(iter);
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Fifo/TaskManager.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,23 @@
+#ifndef _TASKMANAGER_H
+#define _TASKMANAGER_H
+#include <stdlib.h>
+#include "List.h"
+#include "Task.h"
+#include "interface.h"
+
+typedef struct _SchedTask {
+	Task *task;
+	Taskrun nextcode;
+	void *rbuff;
+	void *wbuff;
+} SchedTask;
+
+typedef struct _TaskManager {
+	List *waitingList;  // list of tasks waiting for others.
+	List *activeList;
+	List *schedTasks;	// list of schedtasks executing now.
+	List *exitTasks;	// list of schedtasks which finished.
+	SchedTask *running;
+} TaskManager;
+
+#endif /* !_TASKMANAGER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Fifo/interface.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,12 @@
+#ifndef _INTERFACE_H
+#define _INTERFACE_H
+// included by user.
+
+typedef __code (*Taskrun)(void*, void*, void*);
+//extern __code (*scheduler)(void*,Taskrun,void*,void*);
+
+#define ENDTASK ((Taskrun)NULL)
+
+#endif /* _INTERFACE_H */
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/List.c	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,202 @@
+#include<stdlib.h>
+/* TODO: malloc.  */
+#include"List.h"
+
+/*
+ *  doubly-linked list.
+ *  interfaces of these routines is based on glib.
+ *
+ *  Usage:
+ *  create new list.
+ *  	list = NULL
+ *  add new data
+ *  	list = _listAddFirst(list, data)
+ *  remove data from the list
+ *  	list = _listRemove(list, data)
+ *  get n-th data
+ *  	data = _listGetnthData(list, n)
+ *
+ *
+ *  NOTE:
+ *  Although `struct List' is a doubly-linked List, the List
+ *  is made as a Ring.  An User's variable is treated as a
+ *  head of the list.  And head->prev is last.  And then if
+ *  list have only one data, both next and prev field of
+ *  head will point to oneself.
+ *  If the variable is NULL, it means no data.
+ */
+
+List *
+_listAddFirst(List* top, void *data)
+{
+	List *newlist;
+	List *last;
+	newlist = malloc(sizeof(struct _List));
+	newlist->data = data;
+
+	if (!top) {
+		newlist->next = newlist;
+		newlist->prev = newlist;
+		return newlist;
+	}
+	last = top->prev;
+	newlist->next = top;
+	newlist->prev = last;
+
+	top->prev = newlist;
+	last->next = newlist;
+	return newlist;
+}
+
+List *
+_listRemove(List *top, void *data)
+{
+	List *t;
+	if (top->data==data) {
+		if (top->next==top) {
+			free(top);
+			return NULL;
+		}
+		List *newtop = top->next;
+		top->next->prev = top->prev;
+		top->prev->next = top->next;
+		free(top);
+		return newtop;
+	}
+	for (t=top->next; t!=top; t=t->next) {
+		if (t->data==data) {
+			t->next->prev = t->prev;
+			t->prev->next = t->next;
+			free(t);
+			return top;
+		}
+	}
+	return top;
+}
+
+void *
+_listGetnthData(List *top, int n)
+{
+	List *t;
+
+	for (t=top; n>0; n--) {
+		t = t->next;
+		if (t==top) return NULL;
+	}
+
+	return t->data;
+}
+void *
+_listGetLastData(List *top)
+{
+	if (!top) return NULL;
+	return top->prev->data;
+}
+
+List *
+_listMoveLasttoFirst(List *top)
+{
+	if (!top) return NULL;
+	return top->prev;
+}
+
+void
+_listApply(List *top, ApplyFn fn, void *arg)
+{
+	List *t = top;
+	do {
+		fn(t->data, arg);
+		t = t->next;
+	} while ( t!=top );
+}
+
+/*
+ *  Iterator's functions.
+ *
+ *  iter = _listIterator(list);
+ *  while ( (data=_listIterNext(iter)!=NULL ) {
+ *  	exe(data);
+ *  	if (data...) {
+ *  		list = _listIterRemove(iter);
+ *  	}
+ *  }
+ */
+ListIter *
+_listIterator(List *top)
+{
+	ListIter *iter;
+	iter = malloc(sizeof(struct _ListIter));
+	iter->head = top;
+	iter->next = top;
+	return iter;
+}
+
+void *
+_listIterNext(ListIter *iter)
+{
+	void *rtn;
+	if (!iter->next) return NULL;
+
+	rtn = iter->next->data;
+	iter->next = iter->next->next;
+	if (iter->next==iter->head) {
+		iter->next = NULL;
+	}
+	return rtn;
+}
+
+void
+_listIterEnd(ListIter *iter)
+{
+	free(iter);
+}
+
+List *
+_listIterRemoveCurrent(ListIter *iter)
+{
+	List *cur;
+	if (!iter->head) return NULL;
+	else if (!iter->next) cur = iter->head->prev;
+	else cur = iter->next->prev;
+
+	if (cur==iter->head) {
+		if (cur->next==iter->head) {
+			free(iter->head);
+			return NULL;
+		}
+		iter->head = iter->head->next;
+	}
+	cur->prev->next = cur->next;
+	cur->next->prev = cur->prev;
+
+	free(cur);
+	return iter->head;
+}
+
+
+/*
+ *  for DEBUG
+ */
+
+int
+_listRingCheck(List *head)
+{
+	List *cur = head;
+
+	if (cur->prev->next!=cur) return 0;
+	if (cur->next->prev!=cur) return 0;
+	do {
+		if (cur->prev->next!=cur) return 0;
+		if (cur->next->prev!=cur) return 0;
+		cur = cur->prev;
+	} while (cur!=head);
+
+	if (cur->prev->next!=cur) return 0;
+	if (cur->next->prev!=cur) return 0;
+	cur = cur->next;
+	if (cur->prev->next!=cur) return 0;
+	if (cur->next->prev!=cur) return 0;
+
+	return 1;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/List.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,31 @@
+#ifndef _LIST_H
+#define _LIST_H
+
+typedef struct _List {
+	void *data;
+	struct _List *next;
+	struct _List *prev;
+} List;
+
+typedef struct _ListIter {
+	struct _List *head;
+	struct _List *next;
+} ListIter;
+
+List * _listAddFirst(List*, void *);
+List * _listRemove(List *, void *);
+void * _listGetnthData(List *, int);
+void * _listGetLastData(List *);
+List * _listMoveLasttoFirst(List *);
+
+typedef int (*ApplyFn)(void*,void*);
+void _listApply(List *, ApplyFn, void *);
+
+
+ListIter * _listIterator(List *);
+void * _listIterNext(ListIter *);
+void _listIterEnd(ListIter *);
+List * _listIterRemoveCurrent(ListIter *);
+
+
+#endif /* !_LIST_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Makefile.am	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,20 @@
+
+CbCCOMPILE = $(CbCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	     $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+
+.cbc.o:
+	$(CbCCOMPILE) -c -o $@ $<
+
+lib_LIBRARIES = libTaskManager.a
+libTaskManager_a_SOURCES = TaskManagerAbst.cbc List.c
+
+if USE_FIFO
+    libTaskManager_a_SOURCES += Fifo/TaskManager.cbc
+    AM_CPPFLAGS = -I$(srcdir)/Fifo
+else
+if USE_PTHREAD
+    libTaskManager_a_SOURCES += pthread/TaskManager.cbc
+    AM_CPPFLAGS = -I$(srcdir)/pthread
+endif
+endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Queue.c	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,98 @@
+#include <stdlib.h>
+#include <pthread.h>
+/* TODO: malloc.  */
+#include "List.h"
+#include "Queue.h"
+
+/*
+ *
+ *  Usage:
+ *
+ */
+
+Queue *
+createQueue(int blocking)
+{
+	Queue *newQ;
+	newQ = malloc(sizeof(struct _Queue));
+	newQ->head = NULL;
+	newQ->tail = NULL;
+	//newQ->mutex = PTHREAD_MUTEX_INITIALIZER;
+	pthread_mutex_init(&newQ->mutex, NULL);
+	return newQ;
+}
+
+void
+Qoffer(Queue *queue, void *data)
+{
+	List *oldhead, *newlist;
+
+	newlist = malloc(sizeof(struct _List));
+
+	pthread_mutex_lock(&queue->mutex);
+	oldhead = queue->head;
+	if (oldhead) {
+		oldhead->prev = newlist;
+	}
+	newlist->next = oldhead;
+	newlist->prev = NULL;
+	queue->head = newlist;
+	queue->length++;
+
+	pthread_mutex_unlock(&queue->mutex);
+	return ;
+}
+
+void *
+Qpoll(Queue *queue)
+{
+	List *first, *second;
+	void *data;
+
+	pthread_mutex_lock(&queue->mutex);
+	first = queue->tail;
+	if (!first) {
+		pthread_mutex_unlock(&queue->mutex);
+		return NULL;
+	}
+
+	second = first->prev;
+	data = first->data;
+	free(first);
+
+	second->next = NULL;
+	queue->tail = second;
+	queue->length--;
+
+	pthread_mutex_unlock(&queue->mutex);
+	return data;
+}
+
+
+
+/*
+ *  for DEBUG
+
+int
+RingCheck(List *head)
+{
+	List *cur = head;
+
+	if (cur->prev->next!=cur) return 0;
+	if (cur->next->prev!=cur) return 0;
+	do {
+		if (cur->prev->next!=cur) return 0;
+		if (cur->next->prev!=cur) return 0;
+		cur = cur->prev;
+	} while (cur!=head);
+
+	if (cur->prev->next!=cur) return 0;
+	if (cur->next->prev!=cur) return 0;
+	cur = cur->next;
+	if (cur->prev->next!=cur) return 0;
+	if (cur->next->prev!=cur) return 0;
+
+	return 1;
+}
+ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Queue.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,17 @@
+#ifndef _QUEUE_H
+#define _QUEUE_H
+#include "List.h"
+#include <pthread.h>
+
+typedef struct _Queue {
+	struct _List *head;
+	struct _List *tail;
+	unsigned int length;
+	pthread_mutex_t mutex;
+} Queue;
+
+Queue * createQueue(int blocking);
+void Qoffer(Queue *queue, void *data);
+void * Qpoll(Queue *queue);
+
+#endif /* !_QUEUE_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Task.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,54 @@
+#ifndef _TASK_H
+#define _TASK_H
+// included by user.
+
+#include "List.h"
+#include "interface.h"
+
+
+#define F_NONE 0x000
+#define F_STARTER 0x001
+#define F_a 0x002
+#define F_b 0x004
+
+typedef struct _TaskType {
+	Taskrun code;
+	char *name;
+	unsigned int flag; // F_STARTER ..
+} TaskType;
+
+
+/* defined by user automatically.  */
+extern const TaskType tasktypes[];
+extern const int max_tasktype;
+
+enum cpu {
+	ANY = 0, // not implemented yet.
+	MAIN,
+	SUB,
+};
+
+/* C++CeriumでのHTaskにあたるのかな  */
+typedef struct _Task {
+	char *name;		// task name.
+	int typeid;		// index of tasktypes array.
+	int id;			// task identifier.
+
+	void *rbuff;
+	void *wbuff;
+	int rsize;
+	int wsize;
+	List *waiter;	// List of tasks waiting for me :-P
+	List *waitee;	// List of tasks keep me waiting :-(
+
+	enum cpu cpu;
+} Task;
+
+
+/* user interfaces.  */
+extern Task * createTask (int, char *);
+extern void taskSetData (Task *, void *, int, void *, int);
+extern void taskSetWait (Task *, Task *);
+
+#endif /* _TASK_H */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/TaskInterface.cbc	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,52 @@
+#include "TaskManager.h"
+#include "TaskScheduler.h"
+#include "taskinit.h"
+
+extern AbstractLayer *ablayer;
+
+Task *
+createTask(int id, char *name)
+{
+	Task *task;
+	if (!name) name = "(no name)";
+
+	task = malloc(sizeof(Task));
+	task->id = id;
+	task->rbuff = NULL;
+	task->wbuff = NULL;
+	task->waiter = NULL;
+	task->waitee = NULL;
+	task->name = name;
+	task->cpu = ANY;
+	task->rsize = 0;
+	task->wsize = 0;
+
+	return task;
+}
+
+void
+taskSetData(Task *task, void *rbuff, int rsize, void *wbuff, int wsize)
+{
+	task->rbuff = rbuff;
+	task->wbuff = wbuff;
+	task->rsize = rsize;
+	task->wsize = wsize;
+}
+
+void
+taskSetWait(Task *task_a, Task *task_b)
+{
+	/* set a waiting for b.  */
+	a->waitee = _listAddFirst(a->waitee, b);
+	b->waiter = _listAddFirst(b->waiter, a);
+}
+
+void
+taskSpawn(Task *task)
+{
+	//tm->waitingList = _listAddFirst(tm->waitingList, task);
+	ablayer->spawnedTasks = _listAddFirst(ablayer->spawnedTasks, task);
+	return ;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/TaskManagerAbst.cbc	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,213 @@
+#include <assert.h>
+#include "TaskManager.h"
+#include "Task.h"
+#include "List.h"
+// TODO: malloc
+
+extern __code checkEvent(TaskManager *);
+extern __code executeTask(TaskManager*, ListIter*, Task*);
+extern __code exitTaskManager(TaskManager*);
+
+typedef List TaskList;
+
+/* declarations  */
+__code initTaskManager (__code(*ret)(TaskManager*,void*), void *arg);
+__code start (TaskManager *manager);
+__code addNewTask (TaskManager *manager, Task *task);
+__code finishTask (TaskManager *manager, Task *task);
+__code noEvent (TaskManager *manager);
+__code getTask (TaskManager *manager, ListIter *iter);
+__code executed (TaskManager *manager, ListIter *iter, Task *task);
+__code cannotExecute (TaskManager *manager, Task *task);
+__code finishTask_1 (TaskManager *manager, Task *task);
+__code finishTask_iter (TaskManager *manager, Task *task, ListIter *iter);
+__code finishTask_end (TaskManager *manager, Task *task);
+void setData (Task *task, void *rbuff, size_t rs, void *wbuff, size_t ws);
+__code searchStartTask(TaskManager *manager);
+__code searchStartTask_1(TaskManager *manager, int i);
+__code startTask(TaskManager *manager, int i);
+
+__code
+initTaskManager(__code(*ret)(TaskManager*,void*), void *arg)
+{
+	TaskManager *manager;
+	manager = malloc(sizeof(TaskManager));
+	goto ret(manager, arg);
+}
+
+/*
+ *  Start first task
+ */
+__code
+searchStartTask(TaskManager *manager)
+{
+	int i=0;
+	goto searchStartTask_1(manager, i);
+}
+__code
+searchStartTask_1(TaskManager *manager, int i)
+{
+	if (tasktypes[i].flag & F_STARTER ) {
+		goto startTask(manager, i);
+	} else {
+		goto searchStartTask_1(manager, i+1);
+	}
+}
+__code
+startTask(TaskManager *manager, int i)
+{
+	Task *task;
+	task = createTask(i, "start task");
+	taskSetData(task, NULL, 0, NULL, 0);
+	taskSpawn(manager, task);
+
+	goto checkEvent(manager);
+}
+
+
+__code
+start(TaskManager *manager)
+{
+	goto checkEvent(manager);
+}
+__code
+addNewTask(TaskManager *manager, Task *task)
+{
+	manager->waitingList = _listAddFirst(manager->waitingList, task);
+	goto start(manager);
+}
+
+__code
+finishTask(TaskManager *manager, Task *task)
+{
+	goto finishTask_1(manager, task);
+}
+
+__code
+noEvent(TaskManager *manager)
+{
+	ListIter *iter;
+	if (!manager->waitingList && !manager->activeList)
+		goto exitTaskManager(manager);
+	iter = _listIterator(manager->waitingList);
+	goto getTask(manager, iter);
+}
+
+__code
+getTask(TaskManager *manager, ListIter *iter)
+{
+	Task *task;
+	task = (Task*)_listIterNext(iter);
+	if (!task)
+		/* iteration finished.  */
+		goto start(manager);
+	if (task->waitee)
+		/* the task has been waiting yet.  */
+		goto getTask(manager, iter);
+	else
+		/* the task is ready!  */
+		goto executeTask(manager, iter, task);
+}
+
+__code
+executed(TaskManager *manager, ListIter *iter, Task *task)
+{
+	manager->waitingList = _listIterRemoveCurrent(iter);
+	manager->activeList = _listAddFirst(manager->activeList, task);
+	goto getTask(manager, iter);
+}
+/*
+__code cannotExecute(TaskManager *manager, Task *task) { }
+*/
+
+
+__code
+finishTask_1(TaskManager *manager, Task *task)
+{
+	ListIter *iter;
+
+	manager->activeList = _listRemove(manager->activeList, task);
+	iter = _listIterator(task->waiter);
+	goto finishTask_iter(manager, task, iter);
+}
+
+__code
+finishTask_iter(TaskManager *manager, Task *task, ListIter *iter)
+{
+	Task *waiter;
+	waiter = _listIterNext(iter);
+	if (waiter) {
+		waiter->waitee = _listRemove(waiter->waitee, task);
+		task->waiter = _listIterRemoveCurrent(iter);
+		goto finishTask_iter(manager, task, iter);
+	} else {
+		_listIterEnd(iter);
+		goto finishTask_end(manager, task);
+	}
+}
+
+__code
+finishTask_end(TaskManager *manager, Task *task)
+{
+	/* TODO: free(task)  */
+	assert (!task->waiter);
+	assert (!task->waitee);
+	free(task);
+	goto start(manager);
+}
+
+
+
+/*
+ * belows is Interfaces for Users.
+ * it should be code segment.  but how?
+ * Now, these interfaces can be used only PPE local.
+ */
+
+Task *
+createTask(int typeid, char *name)
+{
+	static int id=0;
+	Task *task;
+	if (!name) name = "(no name)";
+
+	task = malloc(sizeof(Task));
+	task->typeid = typeid;
+	task->id = id++;
+	task->rbuff = NULL;
+	task->wbuff = NULL;
+	task->waiter = NULL;
+	task->waitee = NULL;
+	task->name = name;
+	task->cpu = ANY;
+	task->rsize = 0;
+	task->wsize = 0;
+
+	return task;
+}
+
+void
+taskSetData(Task *task, void *rbuff, int rsize, void *wbuff, int wsize)
+{
+	task->rbuff = rbuff;
+	task->wbuff = wbuff;
+	task->rsize = rsize;
+	task->wsize = wsize;
+}
+
+void
+taskSetWait(Task *task_a, Task *task_b)
+{
+	/* set a waiting for b.  */
+	task_a->waitee = _listAddFirst(task_a->waitee, task_b);
+	task_b->waiter = _listAddFirst(task_b->waiter, task_a);
+}
+
+void
+taskSpawn(TaskManager *manager, Task *task)
+{
+	manager->waitingList = _listAddFirst(manager->waitingList, task);
+	//ablayer->spawnedTasks = _listAddFirst(ablayer->spawnedTasks, task);
+	return ;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/TaskQueue.c	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,94 @@
+#include <stdlib.h>
+// TODO: malloc
+#include "List.h"
+#include "Queue.h"
+
+typedef struct _Queue {
+	List *head;
+	List *tail;
+	int length;
+} Queue;
+
+Queue *
+newQueue()
+{
+	Queue *queue;
+	malloc(sizeof(struct _Queue));
+	queue->head = NULL;
+	queue->tail = NULL;
+	queue->length = 0;
+	return queue;
+}
+
+void
+_QaddFirst(Queue *queue, void *)
+{
+	List *oldhead = queue->head;
+	List *newlist;
+	newlist = malloc(sizeof(struct _List));
+
+	if (oldhead) {
+		oldhead->prev = newlist;
+	}
+	newlist->next = oldhead;
+	newlist->prev = NULL;
+	queue->head = newlist;
+	queue->length++;
+	return ;
+}
+
+void
+_QaddLast(Queue *queue, void *task)
+{
+	List *oldtail = queue->tail;
+	List *newlist;
+	newlist = malloc(sizeof(struct _List));
+
+	if (oldtail) {
+		oldtail->next = newlist;
+	}
+	newlist->next = NULL;
+	newlist->prev = oldtail;
+	queue->tail = newlist;
+	queue->length++;
+	return ;
+}
+
+void *
+_QpollFirst(Queue *queue)
+{
+	List *first = queue->head;
+	List *second;
+	void *task;
+	if (!first) return NULL;
+
+	second = first->next;
+	task = first->task;
+	free(first);
+
+	second->prev = NULL;
+	queue->head = second;
+	queue->length--;
+	return task;
+}
+
+void *
+_QpollLast(Queue *queue)
+{
+	List *first = queue->tail;
+	List *second;
+	void *task;
+	if (!first) return NULL;
+
+	second = first->prev;
+	task = first->task;
+	free(first);
+
+	second->next = NULL;
+	queue->tail = second;
+	queue->length--;
+	return task;
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pthread/TaskManager.cbc	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,220 @@
+#include "TaskManager.h"
+#include "Task.h"
+#include "Debug.h"
+
+/* defined in TaskManagerAbst.  */
+extern Task *createTask(int, char *);
+extern void taskSetData(Task*, void*, int, void*, int);
+extern void taskSpawn(TaskManager*, Task*);
+
+/* declarations of code segment.  */
+int main (int argc, char **argv);
+__code startTaskManager ();
+__code searchStartTask (TaskManager *manager);
+__code searchStartTask_1 (TaskManager *manager, int i);
+__code startTask (TaskManager *manager, int i);
+__code executeTask (TaskManager *manager, ListIter *iter, Task *task);
+__code checkEvent (TaskManager *manager);
+__code checkEvent_real (TaskManager *manager);
+__code selectCode (TaskManager *tsched);
+__code schedEntry (TaskManager *tsched, Taskrun nextcode, void *rbuff, void *wbuff);
+
+/* external code segments.  */
+extern __code executed (TaskManager *manager, ListIter *iter, Task *task);
+extern __code finishTask (TaskManager *manager, Task *task);
+extern __code noEvent (TaskManager *manager);
+extern __code searchStartTask(TaskManager *manager);
+
+
+/* for Debug.  */
+void printTasks(TaskManager *manager);
+
+
+/* Global variable for user task.  */
+__code (*scheduler)(TaskManager*, Taskrun, void*, void*);
+
+
+
+
+int
+main(int argc, char **argv)
+{
+	goto startTaskManager();
+}
+
+// TODO: some codes are moved to TaskManagerAbst.
+/*
+ *   Initialization
+ */
+__code
+startTaskManager()
+{
+	TaskManager *manager;
+	manager = malloc(sizeof(TaskManager));
+	manager->waitingList = NULL;
+	manager->activeList = NULL;
+	manager->finishtaskQ = createQueue();
+	scheduler = schedEntry;
+	goto startThreadManager(manager);
+}
+
+/*
+ *  Initialize all ThreadManager.
+ */
+__code
+startThreadManager(TaskManager *manager)
+{
+	manager->thread_num = 3//TODO ;
+	manager->thread = malloc(sizeof(ThreadManager)*manager->thread_num);
+	goto startThreadManager_iter(manager, 0);
+}
+__code
+startThreadManager_iter(TaskManager *manager, int i)
+{
+	if (i < thread_num) {
+		manager->thread[i].finishtaskQ = manager->finishtaskQ;
+		manager->thread[i].newtaskQ = createQueue();
+		manager->thread[i].thread_id = i;
+		manager->thread[i].finishFlag = 0;
+		manager->thread[i].schedTasks = NULL;
+		manager->thread[i].running = NULL;
+		pthread_create(&manager->thread[i].thread, NULL, threadbase, &manager->thread[i]);
+		goto startThreadManager(manager, i+1);
+	} else {
+		goto searchStartTask(manager);
+	}
+}
+
+
+
+__code
+executeTask(TaskManager *manager, ListIter *iter, Task *task)
+{
+	if (task->cpu==MAIN) {
+		SchedTask *stask;
+		stask = malloc(sizeof(SchedTask));
+		stask->task = task;
+		stask->nextcode = tasktypes[task->typeid].code;
+		stask->rbuff = task->rbuff;
+		stask->wbuff = task->wbuff;
+
+		manager->schedTasks = _listAddFirst(manager->schedTasks, stask);
+	} else {
+		Qoffer(manager->thread[manager->thread_round].newtaskQ, task);
+	}
+	goto executed(manager, iter, task);
+}
+
+__code
+checkEvent(TaskManager *manager)
+{
+	goto selectCode(manager);
+	// to selectCode, run tasks, and return to checkEvent_real.
+}
+__code
+checkEvent_real(TaskManager *manager)
+{
+	SchedTask *stask;
+	Task *task;
+	//printTasks(manager);
+	if (manager->exitTasks) {
+		stask = _listGetnthData(manager->exitTasks, 0);
+		manager->exitTasks = _listRemove(manager->exitTasks, stask);
+		task = stask->task;
+		free(stask);
+		__DEBUG("task[%d] finished.\n", task->id);
+		goto finishTask(manager, task);
+	/*} else if (manager->newtasks) { */
+	} else {
+		goto noEvent(manager);
+	}
+}
+
+__code
+exitTaskManager(TaskManager *manager)
+{
+	__DEBUG("all tasks finished!\n");
+	exit(0);
+}
+
+
+/*
+ *  Scheduler
+ */
+__code
+selectCode(TaskManager *tsched)
+{
+	SchedTask *task;
+	if (tsched->schedTasks) {
+		task = (SchedTask*)_listGetLastData(tsched->schedTasks);
+		tsched->running = task;
+
+		/* goto user-defined task.  */
+		goto task->nextcode(tsched, task->task->rbuff, task->task->wbuff);
+	} else {
+		/* no task we have.  */
+		//goto checkNewCode();
+		goto checkEvent_real(tsched);
+	}
+}
+
+__code
+schedEntry(TaskManager *tsched, Taskrun nextcode, void *rbuff, void *wbuff)
+{
+	/* schedulerd  */
+	if ( nextcode==NULL ) {
+		/* the task finished.  */
+		tsched->schedTasks =
+			_listRemove(tsched->schedTasks, tsched->running);
+		tsched->exitTasks =
+			_listAddFirst(tsched->exitTasks, tsched->running);
+		goto selectCode(tsched);
+	} else {
+		/* save the next code segment for the task.  */
+		tsched->running->nextcode = nextcode;
+		tsched->running->rbuff = rbuff;
+		tsched->running->wbuff = wbuff;
+		/* move last task to first to be fair.  */
+		tsched->schedTasks = _listMoveLasttoFirst(tsched->schedTasks);
+		goto selectCode(tsched);
+	}
+}
+
+
+
+/*
+ *  for Debug.
+ */
+void
+printTasks(TaskManager *manager)
+{
+	Task *task;
+	SchedTask *stask;
+	ListIter *iter;
+	__DEBUG("waiting:\n\t");
+	iter = _listIterator(manager->waitingList);
+	while ( (task=_listIterNext(iter))!=NULL ) {
+		__DEBUGnoF("%d, ", task->id);
+	}
+	__DEBUGnoF("\n");
+	_listIterEnd(iter);
+
+	__DEBUG("scheduled:\n\t");
+	iter = _listIterator(manager->schedTasks);
+	while ( (stask=_listIterNext(iter))!=NULL ) {
+		__DEBUGnoF("%d, ", stask->task->id);
+	}
+	__DEBUGnoF("\n");
+	_listIterEnd(iter);
+
+	__DEBUG("exit:\n\t");
+	iter = _listIterator(manager->exitTasks);
+	while ( (stask=_listIterNext(iter))!=NULL ) {
+		__DEBUGnoF("%d, ", stask->task->id);
+	}
+	__DEBUGnoF("\n");
+	_listIterEnd(iter);
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pthread/TaskManager.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,29 @@
+#ifndef _TASKMANAGER_H
+#define _TASKMANAGER_H
+#include <stdlib.h>
+#include "List.h"
+#include "Task.h"
+#include "interface.h"
+#include "ThreadManager.h"
+
+typedef struct _SchedTask {
+	Task *task;
+	Taskrun nextcode;
+	void *rbuff;
+	void *wbuff;
+} SchedTask;
+
+typedef struct _TaskManager {
+	List *waitingList;  // list of tasks waiting for others.
+	List *activeList;
+	//List *schedTasks;	// list of schedtasks executing now.
+	//List *exitTasks;	// list of schedtasks which finished.
+
+	ThreadManager *thread;	// array of thread id.
+	int thread_num;
+
+	Queue finishtaskQ;  // Task Queue which shared by TaskManager
+	                  	// and all ThreadManagers.
+} TaskManager;
+
+#endif /* !_TASKMANAGER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pthread/ThreadManager.cbc	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,113 @@
+#include <stdlib.h>
+#include <pthread.h>
+// TODO: malloc
+
+#include "Debug.h"
+#include "Fifo/SchedTask.h"
+
+
+typedef struct _ThreadManager {
+	pthread_t thread;
+	int thread_id;
+	int finishFlag;
+
+	// These Queue should be changed to Blocking-Queue.
+	// Now, when the thread has no task, he wait by busy loop.
+	Queue newtaskQ;
+	Queue finishtaskQ;
+
+	List schedTasks;
+	SchedTask running;
+} ThreadManager;
+
+
+void *
+threadbase(void *args)
+{
+	ThreadManager *manager = args;
+	goto threadloop(manager);
+}
+
+
+__code
+threadloop(ThreadManager *manager)
+{
+	if (manager->finishFlag)
+		goto exitThread(manager);
+	else
+		goto checkNewTask(manager);
+}
+
+__code
+exitThread(ThreadManager *manager)
+{
+	__DEBUG("thread whose id is %d finished!", manager->thread_id);
+	pthread_exit(0);
+}
+
+__code
+checkNewTask(ThreadManager *manager)
+{
+	Task *task;
+	task = Qpoll(newtaskQ);
+	if (task) {
+		SchedTask *stask;
+		stask = malloc(sizeof(SchedTask));
+		stask->task = task;
+		stask->nextcode = tasktypes[task->typeid].code;
+		stask->rbuff = task->rbuff;
+		stask->wbuff = task->wbuff;
+
+		manager->schedTasks = _listAddFirst(manager->schedTasks, stask);
+		goto checkNewTask(manager);
+	} else {
+		goto selectCode(manager);
+	}
+}
+
+/*
+ *  Scheduler
+ *  copied from Fifo/TaskManager.cbc.
+ *  it may should be organized to common codes.
+ */
+__code
+selectCode(ThreadManager *manager)
+{
+	SchedTask *task;
+	if (manager->schedTasks) {
+		task = (SchedTask*)_listGetLastData(manager->schedTasks);
+		manager->running = task;
+
+		/* goto user-defined task.  */
+		goto task->nextcode(manager, task->task->rbuff, task->task->wbuff);
+	} else {
+		/* no task we have.  */
+		//goto checkNewCode();
+		goto threadloop(manager);
+	}
+}
+
+__code
+schedEntry(ThreadManager *manager, Taskrun nextcode, void *rbuff, void *wbuff)
+{
+	/* schedulerd  */
+	if ( nextcode==NULL ) {
+		/* the task finished.  */
+		manager->schedTasks =
+			_listRemove(manager->schedTasks, manager->running);
+		Qoffer(manager->finishtaskQ, manager->running->task);
+		//goto selectCode(manager);
+		goto threadloop(manager);
+	} else {
+		/* save the next code segment for the task.  */
+		manager->running->nextcode = nextcode;
+		manager->running->rbuff = rbuff;
+		manager->running->wbuff = wbuff;
+		/* move last task to first to be fair.  */
+		manager->schedTasks = _listMoveLasttoFirst(manager->schedTasks);
+		goto selectCode(manager);
+	}
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/taskinit.cbc	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,19 @@
+#include "Task.h"
+#include "taskinit.h"
+
+
+const int max_tasktype = MAX_TASKCLASS;
+extern __code nojob(void *, void *, void *);
+
+#undef DEFINETASKTYPE
+#define DEFINETASKTYPE(_var, _code0, _name, _type) \
+	{ _code0, _name, _type }, 
+
+const TaskType tasktypes[] = {
+	{ nojob, "no jobs", F_NONE },
+	{ nojob, "no jobs", F_NONE },
+	#include "task.def"
+};
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/taskinit.h	Fri Jan 08 14:40:49 2010 +0900
@@ -0,0 +1,28 @@
+
+/* 自動生成ファイル?  */
+/* Ceriumが自動で生成するけど、ユーザ側でコンパイルするべきかな  */
+
+/* ユーザはtasks.defを定義する  */
+/* DEFINETASK(TASK, code, "task name", CPU_TYPE) */
+
+/* define code segment of tasks.  */
+#undef DEFINETASKTYPE
+#define DEFINETASKTYPE(_var, _code0, _name, _type) \
+	extern __code _code0(void*,void*,void*);
+
+#include "task.def"
+
+//extern __code taskA(Scheduler, void*, void*);
+//extern __code taskB(Scheduler, void*, void*);
+
+/* define task type id.  */
+#undef DEFINETASKTYPE
+#define DEFINETASKTYPE(_var, _code0, _name, _type) \
+	_var,
+enum typeid {
+	NOP = 0,
+	DUMMY,
+	#include "task.def"
+	MAX_TASKCLASS
+};
+
--- a/taskinit.cbc	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-#include "Task.h"
-#include "taskinit.h"
-
-
-const int max_tasktype = MAX_TASKCLASS;
-extern __code nojob(void *, void *, void *);
-
-#undef DEFINETASKTYPE
-#define DEFINETASKTYPE(_var, _code0, _name, _type) \
-	{ _code0, _name, _type }, 
-
-const TaskType tasktypes[] = {
-	{ nojob, "no jobs", F_NONE },
-	{ nojob, "no jobs", F_NONE },
-	#include "task.def"
-};
-
-
-
--- a/taskinit.h	Wed Jan 06 11:28:15 2010 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-
-/* 自動生成ファイル?  */
-/* Ceriumが自動で生成するけど、ユーザ側でコンパイルするべきかな  */
-
-/* ユーザはtasks.defを定義する  */
-/* DEFINETASK(TASK, code, "task name", CPU_TYPE) */
-
-/* define code segment of tasks.  */
-#undef DEFINETASKTYPE
-#define DEFINETASKTYPE(_var, _code0, _name, _type) \
-	extern __code _code0(void*,void*,void*);
-
-#include "task.def"
-
-//extern __code taskA(Scheduler, void*, void*);
-//extern __code taskB(Scheduler, void*, void*);
-
-/* define task type id.  */
-#undef DEFINETASKTYPE
-#define DEFINETASKTYPE(_var, _code0, _name, _type) \
-	_var,
-enum typeid {
-	NOP = 0,
-	DUMMY,
-	#include "task.def"
-	MAX_TASKCLASS
-};
-
--- a/test/list/Makefile	Wed Jan 06 11:28:15 2010 +0900
+++ b/test/list/Makefile	Fri Jan 08 14:40:49 2010 +0900
@@ -1,6 +1,6 @@
 CC = gcc
 
-INCLUDE = -I../../
+INCLUDE = -I../../src
 CFLAGS = -g -O0 $(INCLUDE)
 
 all: testlist testiter
@@ -8,8 +8,8 @@
 .c.o:
 	$(CC) -c $(CFLAGS) -o $@ $<
 
-testlist: testlist.o ../../List.o
+testlist: testlist.o ../../src/List.o
 	$(CC) -o $@ $^
-testiter: testiter.o ../../List.o
+testiter: testiter.o ../../src/List.o
 	$(CC) -o $@ $^