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