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