comparison 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
comparison
equal deleted inserted replaced
1:aef83aed7a07 2:803d6bf22e6d
1 #include <stdlib.h>
2 #include "List.h"
3 #include "Task.h"
1 4
2 5
3 typedef __code (*Scheduler)(); 6 /*
4 typedef __code (*Taskrun)(Scheduler, void*, void*); 7 * User interfaces.
8 */
5 9
6 typedef struct _Task { 10 Task *
7 Taskrun run; 11 createTask(int id, char *name)
12 {
13 Task *task;
14 if (!name) name = "(no name)";
8 15
9 TaskList waiter; // List of tasks waiting for me :-P 16 task = malloc(sizeof(Task));
10 TaskList waitee; // List of tasks keep me waiting :-( 17 task->id = id;
11 } Task; 18 task->rbuff = NULL;
19 task->wbuff = NULL;
20 task->waiter = NULL;
21 task->waitee = NULL;
22 task->name = name;
23 task->cpu = ANY;
24 task->rsize = 0;
25 task->wsize = 0;
12 26
13 27 return task;
14 typedef struct _TaskList {
15 Task *task;
16 struct _TaskList *next;
17 struct _TaskList *prev;
18 } TaskList;
19
20 /*
21 * use this function like below.
22 * list = listAddFirst(list, task);
23 */
24 TaskList *
25 listAddFirst(TaskList* top, Task *task)
26 {
27 if (!top) {
28 newlist = malloc(sizeof(struct _TaskList));
29 newlist->task = task;
30 newlist->next = newlist;
31 newlist->prev = newlist;
32 return newlist;
33 }
34 TaskList *last = top->prev;
35
36 newlist = malloc(sizeof(struct _TaskList));
37 newlist->task = task;
38 newlist->next = top;
39 newlist->prev = last;
40
41 top->prev = newlist;
42 last->next = newlist;
43 return newlist;
44 } 28 }
45 29
46 TaskList * 30 void
47 listAddLast(TaskList* top, Task *task) 31 taskSetData(Task *task, void *rbuff, int rsize, void *wbuff, int wsize)
48 { 32 {
49 /* 33 task->rbuff = rbuff;
50 if (!top) { 34 task->wbuff = wbuff;
51 newlist = malloc(sizeof(struct _TaskList)); 35 task->rsize = rsize;
52 newlist->task = task; 36 task->wsize = wsize;
53 newlist->next = newlist;
54 newlist->prev = newlist;
55 return newlist;
56 }
57 TaskList *last = top->prev;
58
59 newlist = malloc(sizeof(struct _TaskList));
60 newlist->task = task;
61 newlist->next = top;
62 newlist->prev = last;
63
64 top->prev = newlist;
65 last->next = newlist;
66 return newlist;
67 */
68 } 37 }
69 38
70 TaskList * 39 void
71 listRemove(TaskList *top, Task *task) 40 taskSetWait(Task *a, Task *b)
72 { 41 {
73 TaskList *t; 42 /* set a waiting for b. */
74 if (top->task==task) { 43 a->waitee = _listAddFirst(a->waitee, b);
75 if (top->next==top) { 44 b->waiter = _listAddFirst(b->waiter, a);
76 free(top);
77 return NULL;
78 }
79 TaskList *newtop = top->next;
80 top->next->prev = top->prev;
81 top->prev->next = top->next;
82 free(top);
83 return newtop;
84 }
85 for (t=top->next; t!=top; t=t->next) {
86 if (t->task==task) {
87 t->next->prev = t->prev;
88 t->prev->next = t->next;
89 free(t);
90 return top;
91 }
92 }
93 return top;
94 } 45 }
95 46
96 typedef int (*ApplyFn)(Task*,void*);
97
98 listApply(TaskList *top, ApplyFn fn, void *arg) {
99 t = top;
100 do {
101 fn(t->task, arg);
102 t = t->next;
103 } while ( t!=top );
104 }
105
106
107