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