57
|
1 #include <stdio.h>
|
|
2 #include <stdlib.h>
|
|
3 #include <string.h>
|
|
4 #include "CellTaskManagerImpl.h"
|
61
|
5 #include "CellBufferManager.h"
|
57
|
6 #include "types.h"
|
65
|
7 #include "error.h"
|
57
|
8
|
67
|
9 CellTaskManagerImpl::CellTaskManagerImpl(int num)
|
|
10 {
|
|
11 machineNum = num;
|
|
12 }
|
|
13
|
57
|
14 void
|
|
15 CellTaskManagerImpl::init(void)
|
|
16 {
|
|
17 TaskManagerImpl::init();
|
|
18
|
60
|
19 bufferManager = new CellBufferManager();
|
57
|
20 bufferManager->init();
|
65
|
21
|
|
22 speThreads = new SpeThreads(machineNum);
|
|
23 speThreads->init();
|
57
|
24 }
|
|
25
|
70
|
26 TaskListPtr
|
|
27 CellTaskManagerImpl::set_task(void)
|
|
28 {
|
|
29 // ここ...直すかな
|
|
30 TaskListPtr list;
|
|
31 TaskQueuePtr queue;
|
|
32 TaskQueuePtr d;
|
|
33 HTaskPtr htask;
|
|
34 TaskPtr task;
|
|
35
|
|
36 queue = ((CellBufferManager*)bufferManager)->speActiveTaskQueue;
|
|
37 if (queue == NULL) {
|
|
38 //return NULL;
|
|
39 goto FINISH;
|
|
40 }
|
|
41
|
|
42 ((CellBufferManager*)bufferManager)->clear_cellTaskList();
|
|
43
|
|
44 while (queue) {
|
|
45 //list = bufferManager->get_available_taskList();
|
|
46 list = ((CellBufferManager*)bufferManager)->machineTaskList[0];
|
|
47 htask = queue->task;
|
|
48 d = queue;
|
|
49 queue = queue->next;
|
|
50
|
|
51 task = &list->tasks[list->length++];
|
|
52 task->command = htask->command;
|
|
53
|
|
54 // Fix me !!!!!
|
|
55 // ださいというか動かないだろこれ。
|
|
56 // かっこいい class 判定がないものか。typeinfoだっけ?
|
|
57 // in,out にあるのが DmaBuffer 以外だったら通信させない決まりにしたい
|
|
58 if (htask->in_addr != 0) {
|
|
59 htask->in_addr->get_buffer(&task->in_addr);
|
|
60 } else {
|
|
61 task->in_addr = 0;
|
|
62 }
|
|
63 if (htask->in_addr != 0) {
|
|
64 htask->out_addr->get_buffer(&task->out_addr);
|
|
65 } else {
|
|
66 task->out_addr = 0;
|
|
67 }
|
|
68 task->in_size = htask->in_size;
|
|
69 task->self = htask;
|
|
70
|
|
71 bufferManager->free_taskQueue(d);
|
|
72 }
|
|
73
|
|
74 ((CellBufferManager*)bufferManager)->speActiveTaskQueue = NULL;
|
|
75
|
|
76 speThreads->send_mail(0, (unsigned int *)(&((CellBufferManager*)bufferManager)->machineTaskList[0]));
|
|
77
|
|
78 FINISH:
|
|
79 return TaskManagerImpl::set_task();
|
|
80 }
|
|
81
|
65
|
82 /**
|
|
83 * mail_list は ppe 側の mail なので、変更せず渡す。
|
|
84 * その前に spe からのメールをチェックする
|
|
85 */
|
|
86 MailQueuePtr
|
|
87 CellTaskManagerImpl::mail_check(MailQueuePtr mail_list)
|
57
|
88 {
|
65
|
89 int id;
|
|
90 int data;
|
70
|
91 MailQueuePtr list, d;
|
|
92 TaskListPtr next_list;
|
|
93
|
|
94 list = TaskManagerImpl::mail_check(mail_list);
|
65
|
95
|
70
|
96 do {
|
|
97 for (id = 0; id < machineNum; id++) {
|
|
98 while (1) {
|
|
99 data = speThreads->get_mail(id);
|
|
100 if (data < 0) break;
|
|
101
|
|
102 // 名前あとでちゃんと決めよう => MY_SPE_... とかじゃなくて
|
|
103 if (data == MY_SPE_STATUS_READY) {
|
|
104 __debug_ppe("[SPE %d] finish\n", id);
|
|
105 } else {
|
|
106 __debug_ppe("[PPE] recv from [SPE %d] : 0x%x\n", id, data);
|
|
107 bufferManager->check_task_finish((HTaskPtr)data);
|
|
108 }
|
65
|
109 }
|
|
110 }
|
76
|
111 } while (list == NULL && bufferManager->waitTaskQueue
|
|
112 && !bufferManager->activeTaskQueue);
|
70
|
113
|
|
114 if (list == NULL) {
|
|
115 next_list = set_task();
|
76
|
116 if (next_list != NULL) {
|
|
117 d = mailManager->create((unsigned int)next_list);
|
|
118 list = MailManager::append_mailQueue(list, d);
|
|
119 }
|
65
|
120 }
|
66
|
121
|
70
|
122 return list;
|
57
|
123 }
|
|
124
|
65
|
125
|
57
|
126 TaskManagerImpl*
|
|
127 create_impl(int num)
|
|
128 {
|
67
|
129 return new CellTaskManagerImpl(num);
|
57
|
130 }
|