Mercurial > hg > Members > kono > Cerium
comparison TaskManager/kernel/schedule/Scheduler.cc @ 619:0decff4e867b
RenewTask removal
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 15 Nov 2009 02:02:30 +0900 |
parents | 42c94f85c779 |
children | 5b178db5988a |
comparison
equal
deleted
inserted
replaced
618:360032cc500e | 619:0decff4e867b |
---|---|
26 hash = 0; | 26 hash = 0; |
27 init_impl(); | 27 init_impl(); |
28 | 28 |
29 for (int i = 0; i < 2; i++) { | 29 for (int i = 0; i < 2; i++) { |
30 buff_taskList[i] = (TaskListPtr)allocate(sizeof(TaskList)); | 30 buff_taskList[i] = (TaskListPtr)allocate(sizeof(TaskList)); |
31 // buff_inListData[i] = (ListDataPtr)allocate(sizeof(ListData)); | |
32 // buff_outListData[i] = (ListDataPtr)allocate(sizeof(ListData)); | |
33 } | 31 } |
34 | 32 |
35 buffFlag_taskList = 0; | 33 buffFlag_taskList = 0; |
36 // buffFlag_inListData = 0; | |
37 // buffFlag_outListData = 0; | |
38 flag_renewTaskList = 0; | |
39 | 34 |
40 // bzero でもいいけど | 35 // bzero でもいいけど |
41 for (int i = 0; i < MAX_GLOBAL_AREA; i++) { | 36 for (int i = 0; i < MAX_GLOBAL_AREA; i++) { |
42 globalList[i] = NULL; | 37 globalList[i] = NULL; |
43 } | 38 } |
45 for (int i = 0; i < MAX_MAINMEM_AREA; i++) { | 40 for (int i = 0; i < MAX_MAINMEM_AREA; i++) { |
46 mainMemList[i] = NULL; | 41 mainMemList[i] = NULL; |
47 } | 42 } |
48 | 43 |
49 | 44 |
50 taskGroup = new TaskGroup; | |
51 renewTop_taskList = NULL; | |
52 renewCur_taskList = NULL; | |
53 bak_curTaskList = NULL; | |
54 } | 45 } |
55 | 46 |
56 void | 47 void |
57 Scheduler::run() | 48 Scheduler::run() |
58 { | 49 { |
81 void | 72 void |
82 Scheduler::finish() | 73 Scheduler::finish() |
83 { | 74 { |
84 free(buff_taskList[0]); | 75 free(buff_taskList[0]); |
85 free(buff_taskList[1]); | 76 free(buff_taskList[1]); |
86 // free(buff_inListData[0]); | |
87 // free(buff_inListData[1]); | |
88 // free(buff_outListData[0]); | |
89 // free(buff_outListData[1]); | |
90 } | 77 } |
91 | 78 |
92 /** | 79 /** |
93 * あらかじめ memory allocte してある TaskList の領域を | 80 * あらかじめ memory allocte してある TaskList の領域を |
94 * パイプラインの各処理が交代して使う。 | 81 * パイプラインの各処理が交代して使う。 |
100 | 87 |
101 return buff_taskList[buffFlag_taskList]; | 88 return buff_taskList[buffFlag_taskList]; |
102 } | 89 } |
103 | 90 |
104 | 91 |
105 /** | |
106 * Task に inListData, outListData を入れたので、 | |
107 * これは必要ないらしい。 | |
108 * | |
109 * あらかじめ memory allocte してある ListData の領域を | |
110 * パイプラインの各処理が交代して使う。 | |
111 */ | |
112 #if 0 | |
113 ListDataPtr | |
114 Scheduler::get_curWriteBuf() | |
115 { | |
116 buffFlag_outListData ^= 1; | |
117 return buff_outListData[buffFlag_outListData]; | |
118 } | |
119 | |
120 | |
121 ListDataPtr | |
122 Scheduler::get_curReadBuf() | |
123 { | |
124 buffFlag_inListData ^= 1; | |
125 return buff_inListData[buffFlag_inListData]; | |
126 } | |
127 #endif | |
128 | |
129 /** | |
130 * タスク内で生成されたタスクを格納する TaskList を取得する | |
131 * 現在格納に使っている TaskList (renewCur_taskList) が使えるならそれを返す | |
132 * もしそうでないなら、新しく TaskList を allocate してそれを返す | |
133 * コード中で renewCur_taskList が NULL になるのは | |
134 * - プログラム開始時 | |
135 * - タスク内生成タスクがある TaskList の実行を新しく始める (Nop2Ready 参照) | |
136 * 以上の場合です | |
137 */ | |
138 TaskListPtr | |
139 Scheduler::get_renewListBuf() | |
140 { | |
141 if (renewCur_taskList && renewCur_taskList->length < TASK_MAX_SIZE) { | |
142 return renewCur_taskList; | |
143 } else { | |
144 TaskListPtr newList = (TaskListPtr)allocate(sizeof(TaskList)); | |
145 newList->length = 0; | |
146 newList->next = NULL; | |
147 renewTop_taskList = TaskList::append(renewTop_taskList, newList); | |
148 renewCur_taskList = newList; | |
149 return newList; | |
150 } | |
151 } | |
152 | |
153 /** | |
154 * 次に実行する Renew Task List を返す | |
155 * | |
156 * @param[in] curList 現在実行中の TaskList | |
157 * 中断して RenewTaskList を行うため | |
158 * バックアップを取っておく | |
159 * @return next RenewTaskList | |
160 */ | |
161 SchedTaskList* | |
162 Scheduler::get_nextRenewTaskList() | |
163 { | |
164 if (renewTop_taskList) { | |
165 TaskListPtr list = renewTop_taskList; | |
166 renewTop_taskList = renewTop_taskList->next; | |
167 renewCur_taskList = NULL; | |
168 | |
169 list->next = NULL; | |
170 SchedTaskList *sched | |
171 = createSchedTaskList((memaddr)list, this, SCHED_TASKLIST_RENEW); | |
172 return sched; | |
173 } else { | |
174 return NULL; | |
175 } | |
176 } | |
177 | |
178 void | |
179 Scheduler::set_backupTaskList(TaskListPtr cur_taskList) | |
180 { | |
181 bak_curTaskList = cur_taskList; | |
182 } | |
183 | |
184 void | |
185 Scheduler::set_backupTaskListIndex(int cur_index) | |
186 { | |
187 bakIndex_taskList = cur_index; | |
188 } | |
189 | |
190 /** | |
191 * RenewTaskList 実行前に中断した TaskList を返す | |
192 * NULL の場合、中断した TaskList は無い。 | |
193 * | |
194 * @return TaskList | |
195 */ | |
196 TaskListPtr | |
197 Scheduler::get_backupTaskList() | |
198 { | |
199 TaskListPtr ret = bak_curTaskList; | |
200 | |
201 bak_curTaskList = NULL; | |
202 return ret; | |
203 } | |
204 | |
205 int | |
206 Scheduler::get_backupTaskListIndex() | |
207 { | |
208 int ret = bakIndex_taskList; | |
209 | |
210 bakIndex_taskList = 0; | |
211 return ret; | |
212 } | |
213 | |
214 void | 92 void |
215 Scheduler::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) | 93 Scheduler::dma_load(void *buf, uint32 addr, uint32 size, uint32 mask) |
216 { | 94 { |
217 connector->dma_load(buf, addr, size, mask); | 95 connector->dma_load(buf, addr, size, mask); |
218 } | 96 } |
252 Scheduler::mail_read() | 130 Scheduler::mail_read() |
253 { | 131 { |
254 return connector->mail_read(); | 132 return connector->mail_read(); |
255 } | 133 } |
256 | 134 |
257 TaskGroupPtr | |
258 Scheduler::set_groupTask(uint32 command) | |
259 { | |
260 TaskGroupPtr ret = taskGroup; | |
261 | |
262 reload_groupTask(); | |
263 | |
264 ret->command = command; | |
265 return ret; | |
266 } | |
267 | |
268 void | |
269 Scheduler::add_groupTask(TaskGroupPtr group, TaskPtr task) | |
270 { | |
271 group->add(task); | |
272 } | |
273 | |
274 void | |
275 Scheduler::remove_groupTask(TaskGroupPtr group, TaskPtr task) | |
276 { | |
277 group->remove(task); | |
278 } | |
279 | |
280 void | |
281 Scheduler::reload_groupTask() | |
282 { | |
283 taskGroup = new TaskGroup; | |
284 } | |
285 | |
286 uint32 | |
287 Scheduler::status_groupTask(TaskGroupPtr group) | |
288 { | |
289 return group->status(); | |
290 } | |
291 | 135 |
292 /* | 136 /* |
293 ここから下は、memory 以下にあるべき | 137 ここから下は、memory 以下にあるべき |
294 */ | 138 */ |
295 | 139 |