view TaskManager.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 "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(TaskTypeID typeid)
{
	static int id=0;	// 今は使ってない… 使う?
	task = allocate(sizeof(Task));

	task->tasktype = tasktypes[typeid];
	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) 
{
}