3
|
1 #include <stdio.h>
|
|
2 #include <stdlib.h>
|
|
3 #include <string.h>
|
|
4 #include "FifoTaskManagerImpl.h"
|
|
5 #include "ppe_spe.h"
|
|
6
|
|
7 void
|
|
8 FifoTaskManagerImpl::init(void)
|
|
9 {
|
|
10 taskInfo = new FifoTaskInfo();
|
|
11 taskInfo->init();
|
|
12
|
|
13 mailManager = new MailManager();
|
|
14 mailManager->init_pool_mailQueue(20);
|
|
15 }
|
|
16
|
|
17 TaskListPtr
|
|
18 FifoTaskManagerImpl::set_task(void)
|
|
19 {
|
|
20 // ここ...直すかな
|
9
|
21 TaskListPtr list = taskInfo->machineTaskList[0];
|
|
22 TaskQueuePtr queue = taskInfo->activeTaskQueue;
|
3
|
23 TaskQueuePtr d;
|
|
24 HTaskPtr htask;
|
|
25 TaskPtr task;
|
|
26
|
|
27 if (queue == NULL) {
|
|
28 return NULL;
|
|
29 }
|
|
30
|
|
31 // Fixme
|
|
32 // ここは、clear_taskList とか?
|
|
33 list->length = 0;
|
|
34
|
|
35 while (queue) {
|
|
36 htask = queue->task;
|
|
37 d = queue;
|
|
38 queue = queue->next;
|
|
39
|
|
40 task = &list->tasks[list->length++];
|
|
41 task->command = htask->command;
|
|
42 task->in_addr = htask->in_addr;
|
|
43 task->out_addr = htask->out_addr;
|
|
44 task->in_size = htask->in_size;
|
|
45 task->self = htask;
|
|
46
|
9
|
47 taskInfo->free_taskQueue(d);
|
3
|
48 }
|
|
49
|
9
|
50 taskInfo->activeTaskQueue = NULL;
|
3
|
51
|
|
52 return list;
|
|
53 }
|
|
54
|
14
|
55 void
|
18
|
56 FifoTaskManagerImpl::spawn_task(HTaskPtr task)
|
14
|
57 {
|
18
|
58 TaskManagerImpl::spawn_task(task);
|
14
|
59 //run();
|
|
60 }
|
|
61
|
3
|
62 // ../spe/main.cpp
|
|
63 extern MailQueuePtr spe_main(MailManager*, MailQueuePtr);
|
|
64
|
|
65 /**
|
|
66 * spe 側は MY_SPE_COMMAND_EXIT を受け取るまでは別スレッドで動き続ける。
|
|
67 * fifo version では sequential に動かすため、
|
|
68 * mail list の最後に番兵として MY_SPE_COMMAND_EXIT のメールを入れる。
|
|
69 * これで、fifo での spe 側は、mail で受け取った task_list を処理した後
|
|
70 * EXIT を受け取って終了する・・・といいな
|
|
71 */
|
|
72 void
|
|
73 FifoTaskManagerImpl::run(void)
|
|
74 {
|
|
75 TaskListPtr list;
|
|
76 MailQueuePtr mail_list = NULL;
|
|
77 MailQueuePtr list_mail = NULL; // task list
|
|
78 MailQueuePtr sentinel = NULL; // 番兵
|
|
79
|
|
80 // 暫定
|
|
81 list = set_task();
|
|
82
|
|
83 list_mail = mailManager->create_mail((unsigned int)list);
|
|
84 mail_list = append_mailQueue(mail_list, list_mail);
|
|
85
|
|
86 do {
|
|
87 sentinel = mailManager->create_mail(MY_SPE_COMMAND_EXIT);
|
|
88 mail_list = append_mailQueue(mail_list, sentinel);
|
|
89
|
|
90 // 返って来た mail_list には、spe からの mail がある
|
|
91 mail_list = spe_main(mailManager, mail_list);
|
|
92 mail_list = mail_check(mail_list);
|
|
93 } while (mail_list);
|
|
94 }
|
|
95
|
|
96 MailQueuePtr
|
|
97 FifoTaskManagerImpl::mail_check(MailQueuePtr mail_list)
|
|
98 {
|
|
99 MailQueuePtr q = mail_list;
|
|
100 MailQueuePtr d;
|
|
101 MailQueuePtr ret = NULL;
|
|
102 unsigned int data;
|
|
103 TaskListPtr next_list;
|
|
104
|
|
105 while (q) {
|
|
106 data = q->data;
|
|
107
|
|
108 if (data == MY_SPE_STATUS_READY) {
|
10
|
109 #ifdef _PPE_DEBUG
|
|
110 printf("[FIFO] finish\n");
|
|
111 #endif
|
3
|
112 next_list = set_task();
|
|
113 if (next_list != NULL) {
|
|
114 d = mailManager->create_mail((unsigned int)next_list);
|
|
115 ret = append_mailQueue(ret, d);
|
|
116 }
|
|
117 } else {
|
10
|
118 #ifdef _PPE_DEBUG
|
|
119 printf("[PPE] recv from : 0x%x\n", data);
|
|
120 #endif
|
3
|
121 taskInfo->check_task_finish((HTaskPtr)data);
|
|
122 }
|
|
123
|
|
124 d = q;
|
|
125 q = q->next;
|
|
126
|
|
127 mailManager->free_mailQueue(d);
|
|
128 }
|
|
129
|
|
130 return ret;
|
|
131 }
|
|
132
|
|
133
|
|
134 TaskManagerImpl*
|
|
135 create_impl(int num)
|
|
136 {
|
|
137 return new FifoTaskManagerImpl();
|
|
138 }
|