Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Fifo/FifoTaskManagerImpl.cc @ 721:2b167196cb27
cleanups..
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 19 Dec 2009 12:12:09 +0900 |
parents | cafffff0f45a |
children | 31d0a5baafdf |
rev | line source |
---|---|
3 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
4 #include "FifoTaskManagerImpl.h" | |
373 | 5 #include "Scheduler.h" |
619 | 6 #include "SchedTask.h" |
47 | 7 #include "types.h" |
109 | 8 #include "error.h" |
685 | 9 #include "SchedNop.h" |
703 | 10 #include "SysFunc.h" |
3 | 11 |
721 | 12 // static void send_alloc_reply(FifoTaskManagerImpl *tm, int id, MainScheduler *s); |
13 | |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
14 FifoTaskManagerImpl::~FifoTaskManagerImpl() |
109 | 15 { |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
16 delete mainScheduler; |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
17 |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
18 delete taskListImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
19 delete taskQueueImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
20 delete htaskImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
21 |
109 | 22 } |
23 | |
24 /** | |
321 | 25 * MailManager は PPE スケジューラとのメール交換、 |
26 * FifoScheduler は PPE 側のスケジューラ | |
27 * BufferManager は Task、TaskList などのメモリ管理(大層なことしてないが | |
109 | 28 */ |
3 | 29 void |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
30 FifoTaskManagerImpl::init() |
3 | 31 { |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
713
diff
changeset
|
32 // TaskManager から呼ばれるので、かなりの部分は初期化されている。 |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
713
diff
changeset
|
33 |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
34 mainScheduler = new MainScheduler(); |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
35 mainScheduler->init(this); |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
36 mainScheduler->id = 0; |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
37 set_scheduler(mainScheduler); |
42 | 38 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
39 taskListImpl = new TaskListInfo; |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
713
diff
changeset
|
40 // taskQueueImpl = new TaskQueueInfo; |
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
713
diff
changeset
|
41 // htaskImpl = new HTaskInfo(); |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
42 |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
43 mainTaskList = taskListImpl->create(); |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
44 |
619 | 45 schedTaskManager = new SchedTask(); |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
46 schedTaskManager->init(0,0,0,mainScheduler); |
619 | 47 |
109 | 48 } |
49 | |
50 /** | |
321 | 51 * これは CellTaskManagerImpl から呼ばれる。 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
52 * TaskList等 は共用で使うので引数に。 |
321 | 53 * CellTaskManagerImpl と FifoTaskManagerImpl が同時に |
373 | 54 * 上のデータにアクセスする事は(今は)ないのでこれでおk |
109 | 55 */ |
56 void | |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
57 FifoTaskManagerImpl::init(MainScheduler *_sched, TaskManagerImpl *tm) |
109 | 58 { |
59 | |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
60 mainScheduler = _sched; |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
61 mainScheduler->init(this); |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
62 set_scheduler(mainScheduler); |
109 | 63 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
64 taskListImpl = tm-> taskListImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
65 taskQueueImpl = tm-> taskQueueImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
66 htaskImpl = tm-> htaskImpl ; |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
713
diff
changeset
|
67 waitTaskQueue = tm->waitTaskQueue; |
109 | 68 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
69 mainTaskList = taskListImpl->create(); |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
70 |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
673
diff
changeset
|
71 schedTaskManager = new SchedTask(); |
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
673
diff
changeset
|
72 schedTaskManager->init(0,0,0,mainScheduler); |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
73 |
109 | 74 } |
75 | |
721 | 76 // void FifoTaskManagerImpl::show_profile() {} |
77 // void FifoTaskManagerImpl::start_profile() {} | |
672 | 78 |
109 | 79 /** |
321 | 80 * スケジューラに渡す TaskList を取得する。 |
109 | 81 * |
321 | 82 * @return 実行タスクリスト |
109 | 83 * |
321 | 84 * ActiveTaskQueue (依存条件は満たし済み) のタスクを |
85 * 実行タスクリストに入れる | |
109 | 86 */ |
87 TaskListPtr | |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
88 FifoTaskManagerImpl::get_runTaskList() |
109 | 89 { |
90 TaskListPtr list, list_top; | |
664 | 91 SimpleTaskPtr task; // Task (SPE に送る Task) |
109 | 92 |
480
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
93 if (activeTaskQueue->empty()) { |
373 | 94 return NULL; |
109 | 95 } |
96 | |
321 | 97 // PPE 側で実行される TaskList |
109 | 98 list_top = mainTaskList; |
99 | |
321 | 100 // list_top->clear() とかの方がいいかもしれん。 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
101 list_top = taskListImpl->clear_taskList(list_top); |
109 | 102 list = list_top; |
103 | |
499 | 104 // printf("active task queue length = %d\n",activeTaskQueue->length()); |
498
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
494
diff
changeset
|
105 while (HTaskPtr htask = activeTaskQueue->poll()) { |
373 | 106 task = &list->tasks[list->length++]; |
713
f725c6455d19
remove SIMPLE_TASK conditional
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
704
diff
changeset
|
107 |
704
6d497c098455
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
108 if (htask->command==TaskArray1) { |
703 | 109 // compatibility |
704
6d497c098455
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
110 int next = (htask->r_size+sizeof(SimpleTask))/sizeof(SimpleTask); |
703 | 111 if (list->length+next>=TASK_MAX_SIZE) { |
112 list->length--; | |
113 TaskListPtr newList = taskListImpl->create(); | |
114 list_top = TaskListInfo::append(list_top, newList); | |
115 list = newList; | |
116 task = &list->tasks[list->length++]; | |
117 } | |
118 Task *array = (Task*)&list->tasks[list->length]; | |
119 list->length += next; | |
704
6d497c098455
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
120 memcpy(array, htask->rbuf, htask->r_size); |
6d497c098455
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
121 free(htask->rbuf); |
6d497c098455
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
122 htask->rbuf = 0; htask->r_size = 0; |
703 | 123 *task = *(SimpleTask*)htask; |
124 } else { | |
125 *task = *(SimpleTask*)htask; | |
126 } | |
373 | 127 if (list->length >= TASK_MAX_SIZE) { |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
128 TaskListPtr newList = taskListImpl->create(); |
373 | 129 list_top = TaskListInfo::append(list_top, newList); |
130 list = newList; | |
131 } | |
499 | 132 // activeTaskQueue->free_(htask); ここで free しないで、 |
133 // mail を待つ | |
109 | 134 } |
135 | |
136 mainTaskList = list_top; | |
137 | |
138 return list_top; | |
139 } | |
140 | |
141 | |
142 void | |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
143 FifoTaskManagerImpl::run() |
109 | 144 { |
145 TaskListPtr list; | |
146 | |
721 | 147 while((list = get_runTaskList())) { |
373 | 148 // list を実行する |
721 | 149 sendTaskList(list); |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
150 // ppe scheduler からの mail を調べる |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
713
diff
changeset
|
151 mail_check(); |
721 | 152 } |
153 if (!waitTaskQueue->empty()) { | |
154 fprintf(stderr,"Dead lock detected\n"); | |
155 } | |
109 | 156 } |
157 | |
158 /** | |
321 | 159 * @param [list] 実行タスクリスト |
160 * @return FifoScheduler からのメール | |
109 | 161 * |
321 | 162 * [Tasklist] -> [番兵] -> scheduler->run を抜ける |
109 | 163 */ |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
164 void |
721 | 165 FifoTaskManagerImpl::sendTaskList(TaskListPtr list) |
109 | 166 { |
721 | 167 // TaskList のアドレスを送る |
168 mainScheduler->mail_write_from_host((memaddr)list); | |
109 | 169 |
721 | 170 // EXIT_COMMAND (番兵的な意味で) |
171 // これを読むと、mainScheduler->run() から抜けて来る。 | |
172 mainScheduler->mail_write_from_host((memaddr)MY_SPE_COMMAND_EXIT); | |
373 | 173 |
721 | 174 // scheduler は受け取ったメールを元に実行する |
175 mainScheduler->run(new SchedNop()); | |
176 // すべてのlistを実行するまで戻らない | |
109 | 177 } |
178 | |
179 /** | |
321 | 180 * PPE Scheduler からのメールをチェックする |
109 | 181 * |
182 * @param [mail_list] | |
321 | 183 * PPE 側で動く Scheduler からのメールリスト |
184 * 終了した Task や、その他(今はまだ実装してないけど)の情報が入ってる | |
109 | 185 * |
373 | 186 * @return Scheduler が次に実行する Task List |
321 | 187 * NULL なら全てのタスクが実行終了したということ |
109 | 188 */ |
189 void | |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
713
diff
changeset
|
190 FifoTaskManagerImpl::mail_check() |
485 | 191 { |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
192 while (mainScheduler->has_mail_from_host()) { |
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
193 memaddr data = mainScheduler->mail_read_from_host(); |
109 | 194 |
625
60aa3f241b10
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
619
diff
changeset
|
195 if (data == (memaddr)MY_SPE_STATUS_READY) { |
373 | 196 __debug_ppe("mail_check(): Task List finish\n"); |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
197 } else if (data == (memaddr)MY_SPE_COMMAND_EXIT) { |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
198 __debug_ppe("mail_check(): Task List finish COMMAND\n"); |
721 | 199 } else if (data == (memaddr)MY_SPE_COMMAND_MALLOC) { |
200 // MY_SPE_COMMAND_MALLOC PPE からのmain memory request | |
201 // 本来は呼ばれないはず... | |
202 fprintf(stderr, "error: MY_SPE_COMMAND_MALLOC from PPE\n"); | |
203 // send_alloc_reply(this, 0, mainScheduler); | |
625
60aa3f241b10
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
619
diff
changeset
|
204 } else if (data != (memaddr)MY_SPE_NOP) { |
373 | 205 __debug_ppe("mail_check(): recv from 0x%x\n", data); |
619 | 206 // post_func を先に実行しないと、systask_finish が active_queue |
207 // 移されてから、wait_for されるという事態が起きることがある。 | |
208 HTaskPtr task = (HTaskPtr)data; | |
209 task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); | |
719
cafffff0f45a
clean up scheduler main loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
713
diff
changeset
|
210 check_task_finish(task, waitTaskQueue); |
373 | 211 } |
109 | 212 } |
3 | 213 } |
214 | |
721 | 215 #if 0 |
216 static void | |
217 send_alloc_reply(FifoTaskManagerImpl *tm, int id, MainScheduler *s) | |
218 { | |
219 /** | |
220 * info[0] = alloc_id; (CellScheduler::mainMem_alloc 参照) | |
221 * info[1] = alloc_addr; | |
222 */ | |
223 memaddr alloc_info[2]; | |
224 long alloc_size; | |
225 long command; | |
226 | |
227 alloc_info[0] = s->mail_read_from_host(); | |
228 alloc_info[1] = s->mail_read_from_host(); | |
229 command = (long)alloc_info[0]; | |
230 alloc_size = (long)alloc_info[1]; | |
231 | |
232 alloc_info[1] = (memaddr)tm->allocate(alloc_size); | |
233 | |
234 s->mail_write_from_host(alloc_info[0]); | |
235 s->mail_write_from_host(alloc_info[1]); | |
236 } | |
237 #endif | |
238 | |
373 | 239 |
109 | 240 /** |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
241 * # # # # # # # # |
109 | 242 * Abstract Factory Pattern |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
243 * # # # # # # # |
109 | 244 */ |
245 #ifdef __CERIUM_FIFO__ | |
373 | 246 TaskManagerImpl* |
3 | 247 create_impl(int num) |
248 { | |
249 return new FifoTaskManagerImpl(); | |
250 } | |
109 | 251 #endif // __CERIUM_FIFO__ |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
252 |