Mercurial > hg > Members > kent > CbCTaskManager
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 ); -} - - -