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