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