Mercurial > hg > Members > kent > CbCTaskManager
comparison TaskScheduler.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 | aef83aed7a07 |
children |
comparison
equal
deleted
inserted
replaced
1:aef83aed7a07 | 2:803d6bf22e6d |
---|---|
2 #include <stdint.h> | 2 #include <stdint.h> |
3 #include <stdlib.h> | 3 #include <stdlib.h> |
4 #include "TaskScheduler.h" | 4 #include "TaskScheduler.h" |
5 #include "List.h" | 5 #include "List.h" |
6 | 6 |
7 enum { | 7 enum wait{ |
8 NOWAIT=0, | 8 NOWAIT=0, |
9 WAIT=1, | 9 WAIT=1, |
10 }; | 10 }; |
11 __code checkNewCode(); | 11 extern __code checkNewCode(TaskScheduler *, enum wait); |
12 | |
13 __code (*scheduler)(void*,Taskrun,void*,void*); | |
12 | 14 |
13 typedef List SchedTaskList; | 15 typedef List SchedTaskList; |
14 #define addSchedTask(a,b) (SchedTaskList*)_listAddFirst((List*)(a),(void*)(b)) | 16 #define addSchedTask(a,b) (SchedTaskList*)_listAddFirst((List*)(a),(void*)(b)) |
15 #define removeTask(a,b) (SchedTaskList*)_listRemove((List*)(a),(void*)(b)) | 17 #define removeTask(a,b) (SchedTaskList*)_listRemove((List*)(a),(void*)(b)) |
16 // inline functionのがいいか | 18 // inline functionのがいいか |
17 | 19 |
18 typedef struct _segment { | 20 __code schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff); |
19 ID id; // task identifier; | |
20 Taskrun nextcode; | |
21 void *rbuff; | |
22 void *wbuff; | |
23 } SchedTask; | |
24 | 21 |
25 typedef struct _scheduler { | 22 //static TaskScheduler *tsched; |
26 /* it may be Singleton. */ | |
27 | |
28 SchedTask *running; | |
29 SchedTaskList *runnable; | |
30 | |
31 } TaskScheduler; | |
32 | |
33 __code schedEntry(Taskrun nextcode, void *rbuff, void *wbuff); | |
34 | |
35 static TaskScheduler *schedule; | |
36 | 23 |
37 extern void *allocate(size_t); | 24 extern void *allocate(size_t); |
38 __code | 25 __code |
39 initScheduler(__code (*ret)(void *), void *arg) | 26 initScheduler(__code (*ret)(TaskScheduler*,void*), void *arg) |
40 { | 27 { |
41 schedule = allocate(sizeof(TaskScheduler)); | 28 TaskScheduler *tsched; |
42 schedule->runnable = NULL; | 29 tsched = allocate(sizeof(TaskScheduler)); |
43 schedule->running = NULL; | 30 tsched->runnable = NULL; |
44 goto ret(arg); | 31 tsched->running = NULL; |
32 //tsched->schedule = SchedEntry; | |
33 scheduler = schedEntry; | |
34 goto ret(tsched, arg); | |
45 } | 35 } |
46 | 36 |
47 __code | 37 __code |
48 addCode(ID id, Taskrun code0, void *rbuff, void *wbuff) | 38 addCode(TaskScheduler *tsched, ID id, Taskrun code0, void *rbuff, void *wbuff) |
49 { | 39 { |
50 SchedTask *newcs; | 40 SchedTask *newst; |
51 newcs = allocate(sizeof(SchedTask)); | 41 newst = allocate(sizeof(SchedTask)); //これはAbstractLayerで生成してもいいのだが… |
52 newcs->nextcode = code0; | 42 newst->nextcode = code0; |
53 newcs->rbuff = rbuff; //taskの遷移で引数が変化しないならいならい | 43 newst->rbuff = rbuff; //taskの遷移で引数が変化しないならいならい |
54 newcs->wbuff = wbuff; | 44 newst->wbuff = wbuff; |
55 | 45 |
56 schedule->runnable = addSchedTask(schedule->runnable, newcs); | 46 /* regist new task to runnable list. */ |
47 tsched->runnable = addSchedTask(tsched->runnable, newst); | |
57 | 48 |
58 goto selectCode(); | 49 goto selectCode(tsched); |
59 } | 50 } |
60 | 51 |
61 __code | 52 __code |
62 selectCode() | 53 selectCode(TaskScheduler *tsched) |
63 { | 54 { |
64 SchedTask *task; | 55 SchedTask *task; |
65 if (schedule->runnable) { | 56 if (tsched->runnable) { |
66 task = _listGetLastData(schedule->runnable); | 57 task = (SchedTask*)_listGetLastData(tsched->runnable); |
67 schedule->running = task; | 58 tsched->running = task; |
68 | 59 |
69 goto task->nextcode((void*)schedEntry, task->rbuff, task->wbuff); | 60 /* goto user-defined task. */ |
61 goto task->nextcode(tsched, task->rbuff, task->wbuff); | |
70 } else { | 62 } else { |
63 /* no task we have. */ | |
71 //goto checkNewCode(); | 64 //goto checkNewCode(); |
72 goto checkNewCode(WAIT); | 65 goto checkNewCode(tsched, WAIT); |
73 } | 66 } |
74 } | 67 } |
75 | 68 |
76 __code | 69 __code |
77 schedEntry(Taskrun nextcode, void *rbuff, void *wbuff) | 70 schedEntry(TaskScheduler *tsched, Taskrun nextcode, void *rbuff, void *wbuff) |
78 { | 71 { |
79 /* nextcode==NULLならTaskは終わったと判断 */ | 72 /* schedulerd */ |
80 /* scheduled */ | |
81 if ( nextcode==NULL ) { | 73 if ( nextcode==NULL ) { |
82 ID id = schedule->running->id; | 74 /* the task finished. */ |
83 schedule->runnable = | 75 ID id = tsched->running->id; |
84 removeTask(schedule->runnable, schedule->running); | 76 tsched->runnable = |
85 free(schedule->running); | 77 removeTask(tsched->runnable, tsched->running); |
86 schedule->running = NULL; | 78 free(tsched->running); |
87 goto exitCode(id); | 79 tsched->running = NULL; |
80 goto exitCode(tsched, id); | |
88 } else { | 81 } else { |
89 SchedTaskList list; | |
90 /* save the next code segment for the task. */ | 82 /* save the next code segment for the task. */ |
91 schedule->running->nextcode = nextcode; | 83 tsched->running->nextcode = nextcode; |
92 schedule->running->rbuff = rbuff; | 84 tsched->running->rbuff = rbuff; |
93 schedule->running->wbuff = wbuff; | 85 tsched->running->wbuff = wbuff; |
94 /* move last task to first to be fair. */ | 86 /* move last task to first to be fair. */ |
95 schedule->runnable = _listMoveLasttoFirst(schedule->runnable); | 87 tsched->runnable = _listMoveLasttoFirst(tsched->runnable); |
96 goto checkNewCode(NOWAIT); | 88 goto checkNewCode(tsched, NOWAIT); |
97 } | 89 } |
98 } | 90 } |
99 | 91 |
100 | 92 |