0
|
1 #include "TaskManager.h"
|
|
2
|
|
3 TaskQueue waitingQueue;
|
|
4 TaskQueue activeQueue;
|
|
5
|
|
6 /*
|
|
7 * TaskManager's main loop.
|
|
8 *
|
|
9 * while (1) {
|
|
10 * checkFinishedTask(); // to scheduler.
|
|
11 * wait2active();
|
|
12 * while (actQisnotempty) {
|
|
13 * task = pollFirst(actQ);
|
|
14 * executeTask(task); // to scheduler.
|
|
15 * }
|
|
16 * }
|
|
17 */
|
|
18 __code TManagerStart()
|
|
19 /* active, waitngタスクリストを整理 */
|
|
20 {
|
|
21 list = activeQueue;
|
|
22 goto executeTasklist(list);
|
|
23 }
|
|
24
|
|
25 __code executeTasklist()
|
|
26 /* */
|
|
27 {
|
|
28 if (0 < activeQueue->length) {
|
|
29 goto TManagerLoop();
|
|
30 }
|
|
31 task = pollFirst(activeQueue);
|
|
32
|
|
33 /*
|
|
34 * rbuff, wbuffの用意
|
|
35 */
|
|
36 goto task->run(TManagerReturnEntry, rbuff, wbuff);
|
|
37 /* Taskへ */
|
|
38 }
|
|
39
|
|
40 __code TManagerReturnEntry()
|
|
41 /* Taskから戻ってくるコードセグメント */
|
|
42 {
|
|
43 /*
|
|
44 * 依存していたtaskに通知?
|
|
45 */
|
|
46 goto executeTasklist(list->cdr);
|
|
47 }
|
|
48
|
|
49 __code TManagerLoop()
|
|
50 {
|
|
51 /*
|
|
52 * waitingTaskからactiveTaskへ
|
|
53 */
|
|
54
|
|
55 goto TManagerStart();
|
|
56 }
|
|
57
|
|
58
|
|
59 __code sched()
|
|
60 {
|
|
61 TaskList *t = waiter;
|
|
62 Task *t;
|
|
63 for (; t!=;);
|
|
64 }
|
|
65
|
|
66
|
|
67 /* belows is Interfaces for Users. */
|
|
68 /* it may be replace to code segment. but how? */
|
|
69
|
1
|
70 Task *newTask(TaskTypeID typeid)
|
0
|
71 {
|
|
72 static int id=0; // 今は使ってない… 使う?
|
|
73 task = allocate(sizeof(Task));
|
|
74
|
1
|
75 task->tasktype = tasktypes[typeid];
|
0
|
76 task->id = id;
|
|
77 task->waiter = NULL;
|
|
78 task->waitee = NULL;
|
|
79
|
|
80 return task;
|
|
81 }
|
|
82
|
|
83 void setData(Task *task, void *rbuff, size_t rs, void *wbuff, size_t ws)
|
|
84 {
|
|
85 task->rbuff = rbuff;
|
|
86 task->wbuff = wbuff;
|
|
87 task->rsize = rsize;
|
|
88 task->wsize = wsize;
|
|
89 }
|
|
90
|
|
91 void spawn(Task *task)
|
|
92 {
|
|
93 }
|
|
94
|
|
95
|