Mercurial > hg > Members > kono > Cerium
annotate TaskManager/kernel/ppe/TaskManagerImpl.cc @ 496:58240647b23b
PS3 double linked TaskQueue worked.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 10 Oct 2009 20:32:55 +0900 |
parents | 17319af4ee39 |
children | 9d225ba0c34f |
rev | line source |
---|---|
5 | 1 #include <stdio.h> |
3 | 2 #include "TaskManagerImpl.h" |
46 | 3 #include "types.h" |
4 #include "error.h" | |
109 | 5 #include "../sys_task/SysTask.h" |
6 | |
220 | 7 static HTaskPtr systask_start; |
109 | 8 static HTaskPtr systask_finish; |
42 | 9 |
3 | 10 void |
109 | 11 noaction(void *p) |
3 | 12 { |
13 } | |
14 | |
109 | 15 TaskManagerImpl::TaskManagerImpl(int num) |
480
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
16 : machineNum(num) { |
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
17 activeTaskQueue = new TaskQueueInfo(); |
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
18 waitTaskQueue = new TaskQueueInfo(); |
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
19 taskQueueImpl = new TaskQueueInfo(); |
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
20 } |
50 | 21 |
220 | 22 /** |
298 | 23 * 一番最初に PPE で実行される systask_start |
24 * 一番最後に、全てのタスクの終了を待つ systask_finish | |
25 * 番兵的な意味で実装 | |
220 | 26 */ |
42 | 27 void |
109 | 28 TaskManagerImpl::systask_init(void) |
42 | 29 { |
109 | 30 systask_register(); |
42 | 31 |
220 | 32 systask_start = create_task(SYSTASK_START); |
109 | 33 systask_finish = create_task(SYSTASK_FINISH); |
220 | 34 |
35 systask_start->spawn(); | |
36 | |
298 | 37 // systask_finish で spawn すると |
220 | 38 // systask_finish->wait_for(systask_finish); |
298 | 39 // とかなって無限ループになるので、 |
40 // これだけは明示的に append_waitTask() で | |
496
58240647b23b
PS3 double linked TaskQueue worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
495
diff
changeset
|
41 TaskQueuePtr q = taskQueueImpl->create(systask_finish); |
58240647b23b
PS3 double linked TaskQueue worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
495
diff
changeset
|
42 append_waitTask(q); |
42 | 43 } |
44 | |
3 | 45 HTaskPtr |
109 | 46 TaskManagerImpl::create_task(int cmd) |
3 | 47 { |
48 HTaskPtr new_task; | |
49 | |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
50 new_task = htaskImpl->create(cmd); |
109 | 51 new_task->post_func = noaction; |
63 | 52 new_task->mimpl = this; |
53 | |
3 | 54 return new_task; |
55 } | |
56 | |
57 /** | |
298 | 58 * task の依存関係を設定 |
59 * master task が終わってから、slave task を実行するように | |
109 | 60 * master->wait_for(slave); |
3 | 61 */ |
62 void | |
63 TaskManagerImpl::set_task_depend(HTaskPtr master, HTaskPtr slave) | |
64 { | |
65 TaskQueuePtr m, s; | |
66 | |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
67 m = taskQueueImpl->create(master); |
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
68 s = taskQueueImpl->create(slave); |
3 | 69 |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
70 master->wait_me->addLast(s); |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
71 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
|
72 s->waiter = m; |
3 | 73 } |
74 | |
109 | 75 /** |
298 | 76 * タスクを実行可能キューまたは待機キューへ追加する。 |
77 * 依存関係が満たされていれば active, まだだったら wait へ。 | |
109 | 78 * task->spawn(); |
79 */ | |
3 | 80 void |
18 | 81 TaskManagerImpl::spawn_task(HTaskPtr task) |
3 | 82 { |
109 | 83 // waiter // master |
84 // waitee // slave | |
496
58240647b23b
PS3 double linked TaskQueue worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
495
diff
changeset
|
85 TaskQueuePtr q = taskQueueImpl->create(task); |
480
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
86 if (task->wait_i->empty()) { |
496
58240647b23b
PS3 double linked TaskQueue worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
495
diff
changeset
|
87 append_activeTask(q); |
3 | 88 } else { |
496
58240647b23b
PS3 double linked TaskQueue worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
495
diff
changeset
|
89 append_waitTask(q); |
3 | 90 } |
109 | 91 |
92 systask_finish->wait_for(task); | |
3 | 93 } |
42 | 94 |
109 | 95 /** |
298 | 96 * Task を実行可能キューに追加する |
109 | 97 */ |
98 void | |
496
58240647b23b
PS3 double linked TaskQueue worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
495
diff
changeset
|
99 TaskManagerImpl::append_activeTask(TaskQueuePtr q) |
109 | 100 { |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
101 activeTaskQueue->addLast(q); |
109 | 102 } |
103 | |
104 /** | |
298 | 105 * タスクが実行する CPU を選択する |
109 | 106 * |
298 | 107 * 現在は CPU_PPE, CPU_SPE, SPE_ANY, SPE_0, SPE_1, ..., SPE_5 |
108 * types.h に書いてます。 | |
109 | 109 */ |
65 | 110 void |
111 TaskManagerImpl::set_task_cpu(HTaskPtr task, CPU_TYPE type) | |
112 { | |
113 task->cpu_type = type; | |
114 } | |
115 | |
109 | 116 /** |
298 | 117 * 終了したタスクから依存の処理とか |
118 * post_func() はこのタスクが終了したら実行する関数。 | |
109 | 119 * |
298 | 120 * @param [task] 終了したタスク |
109 | 121 */ |
122 void | |
123 TaskManagerImpl::check_task_finish(HTaskPtr task) | |
42 | 124 { |
480
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
125 while(TaskQueue *p = task->wait_me->poll()) { |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
126 HTaskPtr htask = (HTaskPtr)p->task; |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
127 TaskQueueInfo *wait_i = htask->wait_i; |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
128 // 相手の wait queue から自分(を指しているTaskQueue)を削除 |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
129 wait_i->remove(p->waiter); |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
130 // queue を free する |
493 | 131 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
|
132 |
493 | 133 wait_i->free_(p); |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
134 } |
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
135 |
109 | 136 task->post_func(task->post_arg); |
475
e083c4ff91c1
BufferManager removed.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
373
diff
changeset
|
137 htaskImpl->free(task); |
109 | 138 } |
42 | 139 |
109 | 140 |
141 void | |
496
58240647b23b
PS3 double linked TaskQueue worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
495
diff
changeset
|
142 TaskManagerImpl::append_waitTask(TaskQueuePtr q) |
109 | 143 { |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
144 waitTaskQueue ->addLast(q); |
109 | 145 } |
146 | |
147 /** | |
298 | 148 * waitQueue の中で依存関係を満たしたタスクは |
149 * activeQueue へ移す | |
109 | 150 */ |
151 void | |
152 TaskManagerImpl::wakeup_waitTask(void) | |
153 { | |
495 | 154 |
155 for(TaskQueuePtr p = waitTaskQueue->getFirst(); p;) { | |
373 | 156 HTaskPtr task = (HTaskPtr)p->task; |
480
46464727d825
TaskQueueInfo initiaization...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
479
diff
changeset
|
157 if (task->wait_i->empty()) { |
495 | 158 TaskQueuePtr next = waitTaskQueue->getNext(p); |
159 waitTaskQueue->remove(p); | |
496
58240647b23b
PS3 double linked TaskQueue worked.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
495
diff
changeset
|
160 append_activeTask(p); |
495 | 161 p = next; |
162 } else { | |
163 p = waitTaskQueue->getNext(p); | |
164 } | |
109 | 165 } |
166 } | |
54 | 167 |
479
5bda98b0b56d
Double Linked List base TaskQueue
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
475
diff
changeset
|
168 /* end */ |