Mercurial > hg > Game > CbCTaskManager
view src/TaskManagerAbst.cbc @ 13:f06fb0370caf
add pthread code that has not been debuged yet.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 08 Jan 2010 20:00:01 +0900 |
parents | 07fab8c367b2 |
children | 5f65da34f4f3 |
line wrap: on
line source
#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); manager->waitingList = _listAddFirst(manager->waitingList, 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); }