5
|
1 #include <stdio.h>
|
3
|
2 #include "TaskManagerImpl.h"
|
|
3
|
42
|
4 #include "ppe_spe.h"
|
|
5
|
3
|
6 void
|
|
7 noaction(void)
|
|
8 {
|
|
9 }
|
|
10
|
|
11 TaskManagerImpl::TaskManagerImpl(int num)
|
|
12 {
|
|
13 machineNum = num;
|
|
14 }
|
|
15
|
42
|
16 void
|
|
17 TaskManagerImpl::init(void)
|
|
18 {
|
|
19 mailManager = new MailManager();
|
|
20 mailManager->init_pool_mailQueue(20);
|
|
21
|
|
22 scheduler = new MainScheduler();
|
|
23 scheduler->init();
|
|
24 scheduler->set_mailManager(mailManager);
|
|
25 }
|
|
26
|
3
|
27 HTaskPtr
|
|
28 TaskManagerImpl::create_task(int cmd, int size,
|
|
29 unsigned long long in_addr,
|
|
30 unsigned long long out_addr,
|
|
31 void (*func)(void))
|
|
32 {
|
|
33 HTaskPtr new_task;
|
|
34
|
|
35 new_task = taskInfo->get_free_task(cmd, size, in_addr, out_addr);
|
|
36
|
|
37 if (func == NULL) {
|
|
38 new_task->post_func = noaction;
|
|
39 } else {
|
|
40 new_task->post_func = func;
|
|
41 }
|
|
42
|
|
43 return new_task;
|
|
44 }
|
|
45
|
|
46 /**
|
|
47 * task の依存関係を設定
|
|
48 * master task が終わってから、slave task を実行するように
|
|
49 */
|
|
50 void
|
|
51 TaskManagerImpl::set_task_depend(HTaskPtr master, HTaskPtr slave)
|
|
52 {
|
|
53 TaskQueuePtr m, s;
|
|
54
|
|
55 m = taskInfo->get_free_taskQueue(master);
|
|
56 s = taskInfo->get_free_taskQueue(slave);
|
|
57
|
|
58 master->wait_me = append_taskQueue(master->wait_me, s);
|
|
59 slave->wait_i = append_taskQueue(slave->wait_i, m);
|
|
60 }
|
|
61
|
|
62 void
|
18
|
63 TaskManagerImpl::spawn_task(HTaskPtr task)
|
3
|
64 {
|
|
65 if (task->wait_i == NULL) {
|
|
66 taskInfo->append_activeTask(task);
|
|
67 } else {
|
|
68 taskInfo->append_waitTask(task);
|
|
69 }
|
|
70 }
|
42
|
71
|
|
72 TaskListPtr
|
|
73 TaskManagerImpl::set_task(void)
|
|
74 {
|
|
75 // ここ...直すかな
|
|
76 TaskListPtr list;
|
|
77 TaskQueuePtr queue;
|
|
78 TaskQueuePtr d;
|
|
79 HTaskPtr htask;
|
|
80 TaskPtr task;
|
|
81
|
|
82 queue = taskInfo->activeTaskQueue;
|
|
83 if (queue == NULL) {
|
|
84 return NULL;
|
|
85 }
|
|
86
|
|
87 taskInfo->clear_taskList();
|
|
88
|
|
89 while (queue) {
|
|
90 list = taskInfo->get_available_taskList();
|
|
91 htask = queue->task;
|
|
92 d = queue;
|
|
93 queue = queue->next;
|
|
94
|
|
95 task = &list->tasks[list->length++];
|
|
96 task->command = htask->command;
|
|
97 task->in_addr = htask->in_addr;
|
|
98 task->out_addr = htask->out_addr;
|
|
99 task->in_size = htask->in_size;
|
|
100 task->self = htask;
|
|
101
|
|
102 taskInfo->free_taskQueue(d);
|
|
103 }
|
|
104
|
|
105 taskInfo->activeTaskQueue = NULL;
|
|
106
|
|
107 return list;
|
|
108 }
|
|
109
|
|
110
|
|
111 // ../spe/main.cpp
|
|
112 extern MailQueuePtr spe_main(MailManager*, MailQueuePtr);
|
|
113
|
|
114 void
|
|
115 TaskManagerImpl::run(void)
|
|
116 {
|
|
117 TaskListPtr list;
|
|
118 MailQueuePtr list_mail; // task list
|
|
119 MailQueuePtr sentinel; // 番兵
|
|
120 MailQueuePtr in_mail_list = NULL;
|
|
121 MailQueuePtr out_mail_list = NULL;
|
|
122
|
|
123 // 暫定
|
|
124 list = set_task();
|
|
125
|
|
126 list_mail = mailManager->create_mail((unsigned int)list);
|
|
127 in_mail_list = append_mailQueue(in_mail_list, list_mail);
|
|
128
|
|
129 do {
|
|
130 sentinel = mailManager->create_mail(MY_SPE_COMMAND_EXIT);
|
|
131 in_mail_list = append_mailQueue(in_mail_list, sentinel);
|
|
132
|
|
133 // 返って来た mail_list には、spe からの mail がある
|
|
134 scheduler->send_mailList(in_mail_list);
|
|
135 scheduler->run();
|
|
136 out_mail_list = scheduler->recv_mailList();
|
|
137 in_mail_list = mail_check(out_mail_list);
|
|
138 } while (in_mail_list);
|
|
139 }
|
|
140
|
|
141 /**
|
|
142 * PPE Scheduler からのメールをチェックする
|
|
143 */
|
|
144 MailQueuePtr
|
|
145 TaskManagerImpl::mail_check(MailQueuePtr mail_list)
|
|
146 {
|
|
147 MailQueuePtr q = mail_list;
|
|
148 MailQueuePtr d;
|
|
149 MailQueuePtr ret = NULL;
|
|
150 unsigned int data;
|
|
151 TaskListPtr next_list;
|
|
152
|
|
153 while (q) {
|
|
154 data = q->data;
|
|
155
|
|
156 if (data == MY_SPE_STATUS_READY) {
|
|
157 #ifdef _PPE_DEBUG
|
|
158 printf("[FIFO] finish\n");
|
|
159 #endif
|
|
160 next_list = set_task();
|
|
161 if (next_list != NULL) {
|
|
162 d = mailManager->create_mail((unsigned int)next_list);
|
|
163 ret = append_mailQueue(ret, d);
|
|
164 }
|
|
165 } else {
|
|
166 #ifdef _PPE_DEBUG
|
|
167 printf("[PPE] recv from : 0x%x\n", data);
|
|
168 #endif
|
|
169 taskInfo->check_task_finish((HTaskPtr)data);
|
|
170 }
|
|
171
|
|
172 d = q;
|
|
173 q = q->next;
|
|
174
|
|
175 mailManager->free_mailQueue(d);
|
|
176 }
|
|
177
|
|
178 return ret;
|
|
179 }
|