Mercurial > hg > Members > kent > CbCTaskManager
view TaskScheduler.cbc @ 1:aef83aed7a07
scheduler test success.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 20 Dec 2009 20:46:53 +0900 |
parents | 5b089096921f |
children | 803d6bf22e6d |
line wrap: on
line source
//#include "Task.h" #include <stdint.h> #include <stdlib.h> #include "TaskScheduler.h" #include "List.h" enum { NOWAIT=0, WAIT=1, }; __code checkNewCode(); 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のがいいか typedef struct _segment { ID id; // task identifier; Taskrun nextcode; void *rbuff; void *wbuff; } SchedTask; typedef struct _scheduler { /* it may be Singleton. */ SchedTask *running; SchedTaskList *runnable; } TaskScheduler; __code schedEntry(Taskrun nextcode, void *rbuff, void *wbuff); static TaskScheduler *schedule; extern void *allocate(size_t); __code initScheduler(__code (*ret)(void *), void *arg) { schedule = allocate(sizeof(TaskScheduler)); schedule->runnable = NULL; schedule->running = NULL; goto ret(arg); } __code addCode(ID id, Taskrun code0, void *rbuff, void *wbuff) { SchedTask *newcs; newcs = allocate(sizeof(SchedTask)); newcs->nextcode = code0; newcs->rbuff = rbuff; //taskの遷移で引数が変化しないならいならい newcs->wbuff = wbuff; schedule->runnable = addSchedTask(schedule->runnable, newcs); goto selectCode(); } __code selectCode() { SchedTask *task; if (schedule->runnable) { task = _listGetLastData(schedule->runnable); schedule->running = task; goto task->nextcode((void*)schedEntry, task->rbuff, task->wbuff); } else { //goto checkNewCode(); goto checkNewCode(WAIT); } } __code schedEntry(Taskrun nextcode, void *rbuff, void *wbuff) { /* nextcode==NULLならTaskは終わったと判断 */ /* scheduled */ if ( nextcode==NULL ) { ID id = schedule->running->id; schedule->runnable = removeTask(schedule->runnable, schedule->running); free(schedule->running); schedule->running = NULL; goto exitCode(id); } else { SchedTaskList list; /* save the next code segment for the task. */ schedule->running->nextcode = nextcode; schedule->running->rbuff = rbuff; schedule->running->wbuff = wbuff; /* move last task to first to be fair. */ schedule->runnable = _listMoveLasttoFirst(schedule->runnable); goto checkNewCode(NOWAIT); } }