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