Mercurial > hg > Members > kent > CbCTaskManager
view TaskManager.cbc @ 0:5b089096921f
first commit.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 18 Dec 2009 21:57:05 +0900 |
parents | |
children | aef83aed7a07 |
line wrap: on
line source
#include "TaskManager.h" TaskQueue waitingQueue; TaskQueue activeQueue; /* * TaskManager's main loop. * * while (1) { * checkFinishedTask(); // to scheduler. * wait2active(); * while (actQisnotempty) { * task = pollFirst(actQ); * executeTask(task); // to scheduler. * } * } */ __code TManagerStart() /* active, waitngタスクリストを整理 */ { list = activeQueue; goto executeTasklist(list); } __code executeTasklist() /* */ { if (0 < activeQueue->length) { goto TManagerLoop(); } task = pollFirst(activeQueue); /* * rbuff, wbuffの用意 */ goto task->run(TManagerReturnEntry, rbuff, wbuff); /* Taskへ */ } __code TManagerReturnEntry() /* Taskから戻ってくるコードセグメント */ { /* * 依存していたtaskに通知? */ goto executeTasklist(list->cdr); } __code TManagerLoop() { /* * waitingTaskからactiveTaskへ */ goto TManagerStart(); } __code sched() { TaskList *t = waiter; Task *t; for (; t!=;); } /* belows is Interfaces for Users. */ /* it may be replace to code segment. but how? */ Task *newTask(int task_id) { static int id=0; // 今は使ってない… 使う? task = allocate(sizeof(Task)); task->taskclass = taskclasses[task_id]; task->id = id; task->waiter = NULL; task->waitee = NULL; return task; } void setData(Task *task, void *rbuff, size_t rs, void *wbuff, size_t ws) { task->rbuff = rbuff; task->wbuff = wbuff; task->rsize = rsize; task->wsize = wsize; } void spawn(Task *task) { }