Mercurial > hg > Game > Cerium
comparison TaskManager/kernel/ppe/TaskManagerImpl.cc @ 498:bce667ff20b9 draft
double linked HTaskInfo/HTask
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 11 Oct 2009 11:46:41 +0900 |
parents | 3429986b8a28 |
children | 981aa2f89a80 |
comparison
equal
deleted
inserted
replaced
497:3429986b8a28 | 498:bce667ff20b9 |
---|---|
12 { | 12 { |
13 } | 13 } |
14 | 14 |
15 TaskManagerImpl::TaskManagerImpl(int num) | 15 TaskManagerImpl::TaskManagerImpl(int num) |
16 : machineNum(num) { | 16 : machineNum(num) { |
17 activeTaskQueue = new TaskQueueInfo(); | 17 activeTaskQueue = new HTaskInfo(); |
18 waitTaskQueue = new TaskQueueInfo(); | 18 waitTaskQueue = new HTaskInfo(); |
19 taskQueueImpl = new TaskQueueInfo(); | 19 htaskImpl = waitTaskQueue ; // any HTaskInfo |
20 taskQueueImpl = new TaskQueueInfo(); | |
20 } | 21 } |
21 | 22 |
22 /** | 23 /** |
23 * 一番最初に PPE で実行される systask_start | 24 * 一番最初に PPE で実行される systask_start |
24 * 一番最後に、全てのタスクの終了を待つ systask_finish | 25 * 一番最後に、全てのタスクの終了を待つ systask_finish |
36 | 37 |
37 // systask_finish で spawn すると | 38 // systask_finish で spawn すると |
38 // systask_finish->wait_for(systask_finish); | 39 // systask_finish->wait_for(systask_finish); |
39 // とかなって無限ループになるので、 | 40 // とかなって無限ループになるので、 |
40 // これだけは明示的に append_waitTask() で | 41 // これだけは明示的に append_waitTask() で |
41 TaskQueuePtr q = taskQueueImpl->create(systask_finish); | 42 append_waitTask(systask_start); |
42 append_waitTask(q); | |
43 } | 43 } |
44 | 44 |
45 HTaskPtr | 45 HTaskPtr |
46 TaskManagerImpl::create_task(int cmd) | 46 TaskManagerImpl::create_task(int cmd) |
47 { | 47 { |
80 void | 80 void |
81 TaskManagerImpl::spawn_task(HTaskPtr task) | 81 TaskManagerImpl::spawn_task(HTaskPtr task) |
82 { | 82 { |
83 // waiter // master | 83 // waiter // master |
84 // waitee // slave | 84 // waitee // slave |
85 TaskQueuePtr q = taskQueueImpl->create(task); | |
86 if (task->wait_i->empty()) { | 85 if (task->wait_i->empty()) { |
87 append_activeTask(q); | 86 append_activeTask(task); |
88 } else { | 87 } else { |
89 append_waitTask(q); | 88 append_waitTask(task); |
90 } | 89 } |
91 | 90 |
92 systask_finish->wait_for(task); | 91 systask_finish->wait_for(task); |
93 } | 92 } |
94 | 93 |
95 /** | 94 /** |
96 * Task を実行可能キューに追加する | 95 * Task を実行可能キューに追加する |
97 */ | 96 */ |
98 void | 97 void |
99 TaskManagerImpl::append_activeTask(TaskQueuePtr q) | 98 TaskManagerImpl::append_activeTask(HTaskPtr q) |
100 { | 99 { |
101 activeTaskQueue->addLast(q); | 100 activeTaskQueue->addLast(q); |
102 } | 101 } |
103 | 102 |
104 /** | 103 /** |
129 wait_i->remove(p->waiter); | 128 wait_i->remove(p->waiter); |
130 // queue を free する | 129 // queue を free する |
131 wait_i->free_(p->waiter); | 130 wait_i->free_(p->waiter); |
132 | 131 |
133 if (wait_i->empty()) { | 132 if (wait_i->empty()) { |
134 waitTaskQueue->remove(you->self); | 133 waitTaskQueue->remove((HTaskPtr)you->task); |
135 append_activeTask(you->self); | 134 append_activeTask((HTaskPtr)you->task); |
136 } | 135 } |
137 | 136 |
138 wait_i->free_(p); | 137 wait_i->free_(p); |
139 } | 138 } |
140 | 139 |
141 me->post_func(me->post_arg); | 140 me->post_func(me->post_arg); |
142 htaskImpl->free(me); | 141 htaskImpl->free_(me); |
143 } | 142 } |
144 | 143 |
145 | 144 |
146 void | 145 void |
147 TaskManagerImpl::append_waitTask(TaskQueuePtr q) | 146 TaskManagerImpl::append_waitTask(HTaskPtr q) |
148 { | 147 { |
149 waitTaskQueue ->addLast(q); | 148 waitTaskQueue ->addLast(q); |
150 } | 149 } |
151 | 150 |
152 /** | 151 /** |