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 /**