Mercurial > hg > Game > CbCTaskManager
view src/Scheduler.cbc @ 20:29835fc96f9f default tip
add Scheduler
add some documents.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 14 Jan 2010 15:08:06 +0900 |
parents | |
children |
line wrap: on
line source
#include "Debug.h" #include "Scheduler.h" typedef struct _Scheduler { TaskQueue newTaskQ; TaskQUeue finishTaskQ; SchedTask taskp; /* previous task. */ SchedTask taskc; /* current task. */ SchedTask taskn; /* next task. */ __code (*read)(struct _Scheduler*); __code (*exec)(struct _Scheduler*); __code (*write)(struct _Scheduler*); } Scheduler; __code schedulerStart() { sched->taskp = NoTask; sched->taskc = NoTask; goto getNewTask(); } __code loop(Scheduler *sched) { sched->taskp = sched->taskc; sched->taskc = sched->taskn; sched->taskn = NULL; if (/*have no task*/) { /* sched->taskp==NOP&&sched->taskp==NOP */ // state patternできるか? goto waitNewTask(sched); } else { goto getNewTask(sched); } } __code getNewTask(Scheduler *sched) { /* we should always have 3 tasks; previous, current and next. */ sched->taskn = queuePoll(newTaskQ); if (!sched->taskn) { sched->taskn = NoTask; /* default task which do nothing. */ } goto sched->read(sched); } __code waitNewTask(Scheduler *sched) { /* wait new task. */ sched->taskn = queueTake(newTaskQ); goto sched->read(sched); } /* depending implementation. */ __code read(Scheduler *sched) { /* start DMA for readbuffer of a next task. */ /* wait for finishing DMA for readbuffer of a current task. */ goto sched->exec(sched); } __code execute(Scheduler *sched) { /* execute current task. */ goto sched->write(sched); } __code write(Scheduler *sched) { /* wait for finishing DMA for writebuffer of a previous task. */ /* start DMA for writebuffer of a current task. */ goto finishTask(sched); } __code finishTask(Scheduler *sched) { queueOffer(sched->finishTaskQ, sched->taskp); goto loop(sched); }