Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Fifo/FifoTaskManagerImpl.cc @ 674:bde5f13adf10
fix many task example (sort).
Dummy task is now system supported.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 06 Dec 2009 00:54:10 +0900 |
parents | d9111086b2c4 |
children | b386522827ae |
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" |
3 | 9 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
10 FifoTaskManagerImpl::~FifoTaskManagerImpl() |
109 | 11 { |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
12 delete mainScheduler; |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
13 |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
14 delete taskListImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
15 delete taskQueueImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
16 delete htaskImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
17 |
109 | 18 } |
19 | |
20 /** | |
321 | 21 * MailManager は PPE スケジューラとのメール交換、 |
22 * FifoScheduler は PPE 側のスケジューラ | |
23 * BufferManager は Task、TaskList などのメモリ管理(大層なことしてないが | |
109 | 24 */ |
3 | 25 void |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
26 FifoTaskManagerImpl::init() |
3 | 27 { |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
28 mainScheduler = new MainScheduler(); |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
29 mainScheduler->init(this); |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
30 mainScheduler->id = 0; |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
31 set_scheduler(mainScheduler); |
42 | 32 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
33 taskListImpl = new TaskListInfo; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
34 taskQueueImpl = new TaskQueueInfo; |
498
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
494
diff
changeset
|
35 htaskImpl = new HTaskInfo(); |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
36 |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
37 mainTaskList = taskListImpl->create(); |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
38 |
619 | 39 schedTaskManager = new SchedTask(); |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
40 schedTaskManager->init(0,0,0,mainScheduler); |
619 | 41 |
109 | 42 } |
43 | |
44 /** | |
321 | 45 * これは CellTaskManagerImpl から呼ばれる。 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
46 * TaskList等 は共用で使うので引数に。 |
321 | 47 * CellTaskManagerImpl と FifoTaskManagerImpl が同時に |
373 | 48 * 上のデータにアクセスする事は(今は)ないのでこれでおk |
109 | 49 */ |
50 void | |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
51 FifoTaskManagerImpl::init(MainScheduler *_sched, TaskManagerImpl *tm) |
109 | 52 { |
53 | |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
54 mainScheduler = _sched; |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
55 mainScheduler->init(this); |
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
56 set_scheduler(mainScheduler); |
109 | 57 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
58 taskListImpl = tm-> taskListImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
59 taskQueueImpl = tm-> taskQueueImpl ; |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
60 htaskImpl = tm-> htaskImpl ; |
485 | 61 waitTaskQueue = NULL; // mail_check で外から設定される |
109 | 62 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
63 mainTaskList = taskListImpl->create(); |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
64 |
674
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
673
diff
changeset
|
65 schedTaskManager = new SchedTask(); |
bde5f13adf10
fix many task example (sort).
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
673
diff
changeset
|
66 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
|
67 |
109 | 68 } |
69 | |
673 | 70 void FifoTaskManagerImpl::show_profile() { |
71 printf("HEHEHEHEH\n"); | |
72 } | |
672 | 73 void FifoTaskManagerImpl::start_profile() {} |
74 | |
109 | 75 /** |
321 | 76 * スケジューラに渡す TaskList を取得する。 |
109 | 77 * |
321 | 78 * @return 実行タスクリスト |
109 | 79 * |
321 | 80 * ActiveTaskQueue (依存条件は満たし済み) のタスクを |
81 * 実行タスクリストに入れる | |
109 | 82 */ |
83 TaskListPtr | |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
84 FifoTaskManagerImpl::get_runTaskList() |
109 | 85 { |
86 TaskListPtr list, list_top; | |
634 | 87 #ifdef SIMPLE_TASK |
664 | 88 SimpleTaskPtr task; // Task (SPE に送る Task) |
634 | 89 #else |
664 | 90 TaskPtr task; // Task (SPE に送る Task) |
634 | 91 #endif |
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++]; |
634 | 107 #ifdef SIMPLE_TASK |
108 *task = *(SimpleTask*)htask; | |
109 #else | |
491 | 110 memcpy(task, (Task*)htask, sizeof(Task)); |
634 | 111 #endif |
373 | 112 if (list->length >= TASK_MAX_SIZE) { |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
113 TaskListPtr newList = taskListImpl->create(); |
373 | 114 list_top = TaskListInfo::append(list_top, newList); |
115 list = newList; | |
116 } | |
499 | 117 // activeTaskQueue->free_(htask); ここで free しないで、 |
118 // mail を待つ | |
109 | 119 } |
120 | |
121 mainTaskList = list_top; | |
122 | |
123 return list_top; | |
124 } | |
125 | |
126 | |
127 void | |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
128 FifoTaskManagerImpl::run() |
109 | 129 { |
130 TaskListPtr list; | |
131 | |
132 list = get_runTaskList(); | |
133 | |
134 do { | |
373 | 135 // list を実行する |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
136 schedule(list); |
109 | 137 |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
138 // ppe scheduler からの mail を調べる |
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
139 mail_check(waitTaskQueue); |
109 | 140 |
373 | 141 // 依存関係を満たしたものは実行可能キューへ |
142 wakeup_waitTask(); | |
143 list = get_runTaskList(); | |
109 | 144 } while (list); |
145 } | |
146 | |
147 /** | |
321 | 148 * @param [list] 実行タスクリスト |
149 * @return FifoScheduler からのメール | |
109 | 150 * |
321 | 151 * [Tasklist] -> [番兵] -> scheduler->run を抜ける |
109 | 152 */ |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
153 void |
109 | 154 FifoTaskManagerImpl::schedule(TaskListPtr list) |
155 { | |
638 | 156 if (list) { |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
157 // TaskList のアドレスを送る |
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
158 mainScheduler->mail_write_from_host((memaddr)list); |
109 | 159 |
638 | 160 // EXIT_COMMAND (番兵的な意味で) |
648
f1e10ba45d28
Mail modification. Working on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
647
diff
changeset
|
161 // これを読むと、mainScheduler->run() から抜けて来る。 |
f1e10ba45d28
Mail modification. Working on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
647
diff
changeset
|
162 mainScheduler->mail_write_from_host((memaddr)MY_SPE_COMMAND_EXIT); |
373 | 163 |
638 | 164 // scheduler は受け取ったメールを元に実行する |
640
a909c50081c2
SimpeTask on Cell worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
638
diff
changeset
|
165 mainScheduler->run(); |
638 | 166 } |
109 | 167 } |
168 | |
169 /** | |
321 | 170 * PPE Scheduler からのメールをチェックする |
109 | 171 * |
172 * @param [mail_list] | |
321 | 173 * PPE 側で動く Scheduler からのメールリスト |
174 * 終了した Task や、その他(今はまだ実装してないけど)の情報が入ってる | |
109 | 175 * |
373 | 176 * @return Scheduler が次に実行する Task List |
321 | 177 * NULL なら全てのタスクが実行終了したということ |
109 | 178 */ |
179 void | |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
180 FifoTaskManagerImpl::mail_check(HTaskInfo *wait_queue) |
485 | 181 { |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
182 while (mainScheduler->has_mail_from_host()) { |
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
183 memaddr data = mainScheduler->mail_read_from_host(); |
109 | 184 |
625
60aa3f241b10
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
619
diff
changeset
|
185 if (data == (memaddr)MY_SPE_STATUS_READY) { |
373 | 186 __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
|
187 } 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
|
188 __debug_ppe("mail_check(): Task List finish COMMAND\n"); |
625
60aa3f241b10
64bit mode worked on Mac OS X.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
619
diff
changeset
|
189 } else if (data != (memaddr)MY_SPE_NOP) { |
373 | 190 __debug_ppe("mail_check(): recv from 0x%x\n", data); |
619 | 191 // post_func を先に実行しないと、systask_finish が active_queue |
192 // 移されてから、wait_for されるという事態が起きることがある。 | |
193 HTaskPtr task = (HTaskPtr)data; | |
194 task->post_func(schedTaskManager, task->post_arg1, task->post_arg2); | |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
644
diff
changeset
|
195 check_task_finish(task, wait_queue); |
373 | 196 } |
109 | 197 } |
3 | 198 } |
199 | |
373 | 200 |
109 | 201 /** |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
202 * # # # # # # # # |
109 | 203 * Abstract Factory Pattern |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
204 * # # # # # # # |
109 | 205 */ |
206 #ifdef __CERIUM_FIFO__ | |
373 | 207 TaskManagerImpl* |
3 | 208 create_impl(int num) |
209 { | |
210 return new FifoTaskManagerImpl(); | |
211 } | |
109 | 212 #endif // __CERIUM_FIFO__ |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
213 |