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