annotate TaskScheduler.cbc @ 3:4595d57d8dd6

..
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Wed, 23 Dec 2009 00:48:25 +0900
parents 803d6bf22e6d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //#include "Task.h"
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 #include <stdint.h>
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 #include <stdlib.h>
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 #include "TaskScheduler.h"
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 #include "List.h"
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
7 enum wait{
1
aef83aed7a07 scheduler test success.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
8 NOWAIT=0,
aef83aed7a07 scheduler test success.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
9 WAIT=1,
aef83aed7a07 scheduler test success.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
10 };
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
11 extern __code checkNewCode(TaskScheduler *, enum wait);
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
12
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
13 __code (*scheduler)(void*,Taskrun,void*,void*);
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 typedef List SchedTaskList;
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 #define addSchedTask(a,b) (SchedTaskList*)_listAddFirst((List*)(a),(void*)(b))
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 #define removeTask(a,b) (SchedTaskList*)_listRemove((List*)(a),(void*)(b))
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 // inline functionのがいいか
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
20 __code schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff);
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
3
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
22 extern void *allocate(size_t);
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 __code
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
25 initScheduler(__code (*ret)(TaskScheduler*,void*), void *arg)
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 {
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
27 TaskScheduler *tsched;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
28 tsched = allocate(sizeof(TaskScheduler));
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
29 tsched->runnable = NULL;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
30 tsched->running = NULL;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
31 //tsched->schedule = SchedEntry;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
32 scheduler = schedEntry;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
33 goto ret(tsched, arg);
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 }
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 __code
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
37 addCode(TaskScheduler *tsched, ID id, Taskrun code0, void *rbuff, void *wbuff)
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 {
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
39 SchedTask *newst;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
40 newst = allocate(sizeof(SchedTask)); //これはAbstractLayerで生成してもいいのだが…
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
41 newst->nextcode = code0;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
42 newst->rbuff = rbuff; //taskの遷移で引数が変化しないならいならい
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
43 newst->wbuff = wbuff;
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
45 /* regist new task to runnable list. */
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
46 tsched->runnable = addSchedTask(tsched->runnable, newst);
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
48 goto selectCode(tsched);
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 }
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 __code
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
52 selectCode(TaskScheduler *tsched)
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 {
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 SchedTask *task;
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
55 if (tsched->runnable) {
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
56 task = (SchedTask*)_listGetLastData(tsched->runnable);
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
57 tsched->running = task;
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
59 /* goto user-defined task. */
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
60 goto task->nextcode(tsched, task->rbuff, task->wbuff);
1
aef83aed7a07 scheduler test success.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
61 } else {
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
62 /* no task we have. */
1
aef83aed7a07 scheduler test success.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
63 //goto checkNewCode();
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
64 goto checkNewCode(tsched, WAIT);
1
aef83aed7a07 scheduler test success.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
65 }
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 }
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 __code
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
69 schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff)
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 {
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
71 /* schedulerd */
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 if ( nextcode==NULL ) {
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
73 /* the task finished. */
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
74 ID id = tsched->running->id;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
75 tsched->runnable =
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
76 removeTask(tsched->runnable, tsched->running);
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
77 free(tsched->running);
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
78 tsched->running = NULL;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
79 goto exitCode(tsched, id);
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 } else {
1
aef83aed7a07 scheduler test success.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
81 /* save the next code segment for the task. */
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
82 tsched->running->nextcode = nextcode;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
83 tsched->running->rbuff = rbuff;
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
84 tsched->running->wbuff = wbuff;
1
aef83aed7a07 scheduler test success.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
85 /* move last task to first to be fair. */
2
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
86 tsched->runnable = _listMoveLasttoFirst(tsched->runnable);
803d6bf22e6d second commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
87 goto checkNewCode(tsched, NOWAIT);
0
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 }
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 }
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
5b089096921f first commit.
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91