diff Task.cbc @ 2:803d6bf22e6d default tip

second commit. it's far to complete..
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Tue, 22 Dec 2009 16:19:56 +0900
parents 5b089096921f
children
line wrap: on
line diff
--- a/Task.cbc	Sun Dec 20 20:46:53 2009 +0900
+++ b/Task.cbc	Tue Dec 22 16:19:56 2009 +0900
@@ -1,107 +1,46 @@
-
-
-typedef __code (*Scheduler)();
-typedef __code (*Taskrun)(Scheduler, void*, void*);
-
-typedef struct _Task {
-	Taskrun run;
+#include <stdlib.h>
+#include "List.h"
+#include "Task.h"
 
-	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);
+ *  User interfaces.
  */
-TaskList *
-listAddFirst(TaskList* top, Task *task)
+
+Task *
+createTask(int id, char *name)
 {
-	if (!top) {
-		newlist = malloc(sizeof(struct _TaskList));
-		newlist->task = task;
-		newlist->next = newlist;
-		newlist->prev = newlist;
-		return newlist;
-	}
-	TaskList *last = top->prev;
+	Task *task;
+	if (!name) name = "(no name)";
 
-	newlist = malloc(sizeof(struct _TaskList));
-	newlist->task = task;
-	newlist->next = top;
-	newlist->prev = last;
+	task = malloc(sizeof(Task));
+	task->id = id;
+	task->rbuff = NULL;
+	task->wbuff = NULL;
+	task->waiter = NULL;
+	task->waitee = NULL;
+	task->name = name;
+	task->cpu = ANY;
+	task->rsize = 0;
+	task->wsize = 0;
 
-	top->prev = newlist;
-	last->next = newlist;
-	return newlist;
+	return task;
 }
 
-TaskList *
-listAddLast(TaskList* top, Task *task)
+void
+taskSetData(Task *task, void *rbuff, int rsize, void *wbuff, int wsize)
 {
-	/*
-	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;
-	*/
+	task->rbuff = rbuff;
+	task->wbuff = wbuff;
+	task->rsize = rsize;
+	task->wsize = wsize;
 }
 
-TaskList *
-listRemove(TaskList *top, Task *task)
+void
+taskSetWait(Task *a, Task *b)
 {
-	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;
+	/* set a waiting for b.  */
+	a->waitee = _listAddFirst(a->waitee, b);
+	b->waiter = _listAddFirst(b->waiter, a);
 }
 
-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 );
-}
-
-
-