view Task.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 803d6bf22e6d
line wrap: on
line source



typedef __code (*Scheduler)();
typedef __code (*Taskrun)(Scheduler, void*, void*);

typedef struct _Task {
	Taskrun run;

	TaskList waiter;	// List of tasks waiting for me :-P
	TaskList waitee;	// List of tasks keep me waiting :-(
} Task;


typedef struct _TaskList {
	Task *task;
	struct _TaskList *next;
	struct _TaskList *prev;
} TaskList;

/*
 * use this function like below.
 *   list = listAddFirst(list, task);
 */
TaskList *
listAddFirst(TaskList* top, Task *task)
{
	if (!top) {
		newlist = malloc(sizeof(struct _TaskList));
		newlist->task = task;
		newlist->next = newlist;
		newlist->prev = newlist;
		return newlist;
	}
	TaskList *last = top->prev;

	newlist = malloc(sizeof(struct _TaskList));
	newlist->task = task;
	newlist->next = top;
	newlist->prev = last;

	top->prev = newlist;
	last->next = newlist;
	return newlist;
}

TaskList *
listAddLast(TaskList* top, Task *task)
{
	/*
	if (!top) {
		newlist = malloc(sizeof(struct _TaskList));
		newlist->task = task;
		newlist->next = newlist;
		newlist->prev = newlist;
		return newlist;
	}
	TaskList *last = top->prev;

	newlist = malloc(sizeof(struct _TaskList));
	newlist->task = task;
	newlist->next = top;
	newlist->prev = last;

	top->prev = newlist;
	last->next = newlist;
	return newlist;
	*/
}

TaskList *
listRemove(TaskList *top, Task *task)
{
	TaskList *t;
	if (top->task==task) {
		if (top->next==top) {
			free(top);
			return NULL;
		}
		TaskList *newtop = top->next;
		top->next->prev = top->prev;
		top->prev->next = top->next;
		free(top);
		return newtop;
	}
	for (t=top->next; t!=top; t=t->next) {
		if (t->task==task) {
			t->next->prev = t->prev;
			t->prev->next = t->next;
			free(t);
			return top;
		}
	}
	return top;
}

typedef int (*ApplyFn)(Task*,void*);

listApply(TaskList *top, ApplyFn fn, void *arg) {
	t = top;
	do {
		fn(t->task, arg);
		t = t->next;
	} while ( t!=top );
}