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) 
{
}