Mercurial > hg > Game > CbCTaskManager
changeset 8:07fab8c367b2
made src directory and move all source files into it.
support autocont and automake tools.
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 */
--- 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
--- /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 $@ $^