Mercurial > hg > Game > Cerium
comparison TaskManager/Cell/CellTaskManagerImpl.cc @ 481:f9ffcffb6d09 draft
Double linked list modification done (tested on Mac OS X)
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 05 Oct 2009 16:46:46 +0900 |
parents | bf2d2625485e |
children | d6245cb38028 |
comparison
equal
deleted
inserted
replaced
480:75e4afa40da2 | 481:f9ffcffb6d09 |
---|---|
31 taskQueueImpl->init(TASK_MAX_SIZE*4); | 31 taskQueueImpl->init(TASK_MAX_SIZE*4); |
32 | 32 |
33 taskListImpl = new CellTaskListInfo; | 33 taskListImpl = new CellTaskListInfo; |
34 taskListImpl->init(machineNum*2); | 34 taskListImpl->init(machineNum*2); |
35 | 35 |
36 activeTaskQueue = new TaskQueueInfo(); | |
37 | |
36 htaskImpl = new CellHTaskInfo; | 38 htaskImpl = new CellHTaskInfo; |
37 htaskImpl->init(TASK_MAX_SIZE*2); | 39 htaskImpl->init(TASK_MAX_SIZE*2); |
38 | 40 |
39 speThreads = new SpeThreads(machineNum); | 41 speThreads = new SpeThreads(machineNum); |
40 speThreads->init(); | 42 speThreads->init(); |
58 } | 60 } |
59 | 61 |
60 void | 62 void |
61 CellTaskManagerImpl::append_activeTask(HTaskPtr task) | 63 CellTaskManagerImpl::append_activeTask(HTaskPtr task) |
62 { | 64 { |
63 TaskQueuePtr q; | |
64 | |
65 q = taskQueueImpl->create(task); | |
66 if (task->cpu_type == CPU_PPE) { | 65 if (task->cpu_type == CPU_PPE) { |
67 ppeManager->append_activeTask(task); | 66 ppeManager->append_activeTask(task); |
68 } else { | 67 } else { |
69 activeTaskQueue = TaskQueue::append(activeTaskQueue, q); | 68 TaskQueuePtr q = taskQueueImpl->create(task); |
69 activeTaskQueue->addLast(q); | |
70 } | 70 } |
71 } | 71 } |
72 | 72 |
73 // SPE_ANY が指定されていた時に | 73 // SPE_ANY が指定されていた時に |
74 // これをインクリメントしつつ呼ぶことにする。 | 74 // これをインクリメントしつつ呼ぶことにする。 |
85 void | 85 void |
86 CellTaskManagerImpl::set_runTaskList(void) | 86 CellTaskManagerImpl::set_runTaskList(void) |
87 { | 87 { |
88 // ここ...直すかな | 88 // ここ...直すかな |
89 TaskListPtr list; | 89 TaskListPtr list; |
90 TaskQueuePtr queue; | 90 |
91 TaskQueuePtr d; | 91 TaskQueuePtr d; |
92 HTaskPtr htask; | 92 HTaskPtr htask; |
93 TaskPtr task; | 93 TaskPtr task; |
94 int speid; | 94 int speid; |
95 | 95 |
96 queue = activeTaskQueue; | 96 if (activeTaskQueue->empty()) { |
97 if (queue == NULL) { | |
98 return ; | 97 return ; |
99 } | 98 } |
100 | 99 |
101 while (queue) { | 100 while (TaskQueuePtr queue = activeTaskQueue->poll()) { |
102 htask = (HTaskPtr)queue->task; | 101 htask = (HTaskPtr)queue->task; |
103 d = queue; | |
104 queue = queue->next; | |
105 | 102 |
106 if (htask->cpu_type == SPE_ANY) { | 103 if (htask->cpu_type == SPE_ANY) { |
107 speid = cur_anySpeid++; | 104 speid = cur_anySpeid++; |
108 cur_anySpeid = (cur_anySpeid < machineNum) | 105 cur_anySpeid = (cur_anySpeid < machineNum) |
109 ? cur_anySpeid : 0; | 106 ? cur_anySpeid : 0; |
137 task->command = htask->command; | 134 task->command = htask->command; |
138 task->inData = htask->inData; | 135 task->inData = htask->inData; |
139 task->outData = htask->outData; | 136 task->outData = htask->outData; |
140 task->self = (unsigned int)htask; | 137 task->self = (unsigned int)htask; |
141 #else | 138 #else |
142 memcpy(task, htask, sizeof(Task)); | 139 memcpy(task, (Task*)htask, sizeof(Task)); |
143 #endif | 140 #endif |
144 | 141 |
145 taskQueueImpl->free(d); | 142 activeTaskQueue->free(queue); |
146 } | 143 } |
147 | 144 |
148 activeTaskQueue = NULL; | 145 activeTaskQueue = NULL; |
149 } | 146 } |
150 | 147 |
257 // 現在の FifoTaskManager の仕様では | 254 // 現在の FifoTaskManager の仕様では |
258 // ・PPE で実行するタスクが無くなれば終了する | 255 // ・PPE で実行するタスクが無くなれば終了する |
259 // であり、この場合もし SPE にタスクが残っていても | 256 // であり、この場合もし SPE にタスクが残っていても |
260 // メインループから抜けてプログラム終了となってしまうので | 257 // メインループから抜けてプログラム終了となってしまうので |
261 // ここでストップかけてます。 | 258 // ここでストップかけてます。 |
262 } while (!ppeManager->activeTaskQueue && waitTaskQueue); | 259 } while (ppeManager->activeTaskQueue->empty() && !waitTaskQueue->empty()); |
263 | 260 |
264 return ppeManager->get_runTaskList(); | 261 return ppeManager->get_runTaskList(); |
265 } | 262 } |
266 | 263 |
267 /** | 264 /** |