Mercurial > hg > Members > kono > Cerium
annotate TaskManager/kernel/ppe/TaskManagerImpl.cc @ 704:6d497c098455
Compatibility mode works.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 14 Dec 2009 19:54:00 +0900 |
parents | 61b59376aec5 |
children | f725c6455d19 |
rev | line source |
---|---|
5 | 1 #include <stdio.h> |
3 | 2 #include "TaskManagerImpl.h" |
46 | 3 #include "types.h" |
4 #include "error.h" | |
518 | 5 #include "SchedTask.h" |
619 | 6 #include "Scheduler.h" |
634 | 7 #include "SysTask.h" |
8 #include "SysFunc.h" | |
619 | 9 |
220 | 10 static HTaskPtr systask_start; |
109 | 11 static HTaskPtr systask_finish; |
42 | 12 |
514 | 13 static void |
14 noaction(SchedTask *s, void *read, void *write) | |
3 | 15 { |
16 } | |
17 | |
109 | 18 TaskManagerImpl::TaskManagerImpl(int num) |
480
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
19 : machineNum(num) { |
498
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
20 activeTaskQueue = new HTaskInfo(); |
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
21 waitTaskQueue = new HTaskInfo(); |
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
22 htaskImpl = waitTaskQueue ; // any HTaskInfo |
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
23 taskQueueImpl = new TaskQueueInfo(); |
480
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
24 } |
50 | 25 |
220 | 26 /** |
298 | 27 * 一番最初に PPE で実行される systask_start |
220 | 28 */ |
42 | 29 void |
499 | 30 TaskManagerImpl::systask_init() |
42 | 31 { |
109 | 32 systask_register(); |
639 | 33 #ifdef SIMPLE_TASK |
34 systask_start = create_task(StartTask,0,0,0,0); | |
35 systask_finish = create_task(FinishTask,0,0,0,0); | |
36 #else | |
634 | 37 systask_start = create_task(StartTask); |
38 systask_finish = create_task(FinishTask); | |
639 | 39 #endif |
220 | 40 |
41 systask_start->spawn(); | |
42 | |
634 | 43 // すべての Task が FinishTask を wait_for すると、 |
44 // あらゆる Task が FinishTask の waiting task queue を操作する | |
45 // ことになる。それは、重すぎる。PPE/SPE Task が終了した時点で、 | |
46 // TaskManager が実行する方が安い。 | |
47 // append_waitTask(systask_finish); | |
48 } | |
49 | |
50 HTaskPtr | |
636
d433fc37587d
Cell Simple Task compiled. but not worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
635
diff
changeset
|
51 TaskManagerImpl::create_task(int cmd,memaddr rbuf, long r_size, memaddr wbuf, long w_size) |
634 | 52 { |
53 HTaskPtr new_task; | |
54 | |
55 new_task = htaskImpl->create(cmd, rbuf, r_size, wbuf, w_size); | |
56 new_task->post_func = noaction; | |
57 new_task->mimpl = this; | |
58 | |
59 return new_task; | |
42 | 60 } |
61 | |
3 | 62 HTaskPtr |
109 | 63 TaskManagerImpl::create_task(int cmd) |
3 | 64 { |
65 HTaskPtr new_task; | |
66 | |
703 | 67 #ifdef SIMPLE_TASK |
68 // for compatibility | |
69 new_task = htaskImpl->create(TaskArray1); | |
70 new_task->post_func = noaction; | |
71 new_task->mimpl = this; | |
72 Task *task = new_task->create_task_array(cmd,1,8,8,8); | |
704
6d497c098455
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
73 new_task->command = TaskArray1; |
6d497c098455
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
74 // new_task->r_size = task->size(); |
6d497c098455
Compatibility mode works.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
703
diff
changeset
|
75 // new_task->rbuf = (memaddr)task; |
703 | 76 #else |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
77 new_task = htaskImpl->create(cmd); |
109 | 78 new_task->post_func = noaction; |
63 | 79 new_task->mimpl = this; |
703 | 80 #endif |
63 | 81 |
3 | 82 return new_task; |
83 } | |
84 | |
85 /** | |
298 | 86 * task の依存関係を設定 |
87 * master task が終わってから、slave task を実行するように | |
109 | 88 * master->wait_for(slave); |
3 | 89 */ |
90 void | |
91 TaskManagerImpl::set_task_depend(HTaskPtr master, HTaskPtr slave) | |
519 | 92 { |
3 | 93 TaskQueuePtr m, s; |
519 | 94 |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
95 m = taskQueueImpl->create(master); |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
96 s = taskQueueImpl->create(slave); |
519 | 97 |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
98 master->wait_me->addLast(s); |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
99 slave->wait_i->addLast(m); |
481
4896dffad67c
Double linked list modification done (tested on Mac OS X)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
480
diff
changeset
|
100 s->waiter = m; |
519 | 101 } |
102 | |
3 | 103 /** |
298 | 104 * タスクを実行可能キューまたは待機キューへ追加する。 |
105 * 依存関係が満たされていれば active, まだだったら wait へ。 | |
109 | 106 * task->spawn(); |
107 */ | |
3 | 108 void |
18 | 109 TaskManagerImpl::spawn_task(HTaskPtr task) |
3 | 110 { |
109 | 111 // waiter // master |
112 // waitee // slave | |
480
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
113 if (task->wait_i->empty()) { |
498
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
114 append_activeTask(task); |
3 | 115 } else { |
498
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
116 append_waitTask(task); |
3 | 117 } |
109 | 118 |
635
8cc609285bbe
SimpleTask worked on Mac OS X
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
634
diff
changeset
|
119 // systask_finish->wait_for(task); |
3 | 120 } |
42 | 121 |
109 | 122 /** |
298 | 123 * Task を実行可能キューに追加する |
109 | 124 */ |
125 void | |
498
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
126 TaskManagerImpl::append_activeTask(HTaskPtr q) |
109 | 127 { |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
128 activeTaskQueue->addLast(q); |
109 | 129 } |
130 | |
131 /** | |
298 | 132 * タスクが実行する CPU を選択する |
109 | 133 * |
298 | 134 * 現在は CPU_PPE, CPU_SPE, SPE_ANY, SPE_0, SPE_1, ..., SPE_5 |
135 * types.h に書いてます。 | |
109 | 136 */ |
65 | 137 void |
138 TaskManagerImpl::set_task_cpu(HTaskPtr task, CPU_TYPE type) | |
139 { | |
664 | 140 if (machineNum==0) |
141 task->cpu_type = CPU_PPE ; | |
142 else | |
143 task->cpu_type = type; | |
65 | 144 } |
145 | |
109 | 146 /** |
298 | 147 * 終了したタスクから依存の処理とか |
148 * post_func() はこのタスクが終了したら実行する関数。 | |
109 | 149 * |
298 | 150 * @param [task] 終了したタスク |
109 | 151 */ |
152 void | |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
639
diff
changeset
|
153 TaskManagerImpl::check_task_finish(HTaskPtr me, HTaskInfo *wait_queue) |
42 | 154 { |
499 | 155 |
497 | 156 while(TaskQueue *p = me->wait_me->poll()) { |
499 | 157 HTaskPtr you = p->task; |
497 | 158 TaskQueueInfo *wait_i = you->wait_i; |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
159 // 相手の wait queue から自分(を指しているTaskQueue)を削除 |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
160 wait_i->remove(p->waiter); |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
161 // queue を free する |
493 | 162 wait_i->free_(p->waiter); |
483
0b933bef0328
renew task worked. but not test_nogl...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
481
diff
changeset
|
163 |
497 | 164 if (wait_i->empty()) { |
647
7c9ded1ea750
MailManager rewrite. not yet worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
639
diff
changeset
|
165 wait_queue->remove(you); |
499 | 166 append_activeTask(you); |
497 | 167 } |
168 | |
493 | 169 wait_i->free_(p); |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
170 } |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
171 |
498
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
172 htaskImpl->free_(me); |
109 | 173 } |
42 | 174 |
109 | 175 |
176 void | |
498
cb5ecfc5aaa3
double linked HTaskInfo/HTask
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
497
diff
changeset
|
177 TaskManagerImpl::append_waitTask(HTaskPtr q) |
109 | 178 { |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
179 waitTaskQueue ->addLast(q); |
109 | 180 } |
181 | |
182 /** | |
298 | 183 * waitQueue の中で依存関係を満たしたタスクは |
184 * activeQueue へ移す | |
109 | 185 */ |
186 void | |
499 | 187 TaskManagerImpl::wakeup_waitTask() |
109 | 188 { |
497 | 189 // done in check_task_finish |
109 | 190 } |
54 | 191 |
619 | 192 |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
193 /* end */ |