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