46
|
1 #include <stdio.h>
|
|
2 #include <stdlib.h>
|
47
|
3 #include "BufferManager.h"
|
46
|
4
|
|
5 BufferManager::BufferManager(int num)
|
|
6 :machineNum(num), activeTaskQueue(NULL), waitTaskQueue(NULL) {}
|
|
7
|
|
8 BufferManager::~BufferManager(void) { finish(); }
|
|
9
|
|
10 void
|
|
11 BufferManager::init(void)
|
|
12 {
|
63
|
13 taskListImpl = new TaskListInfo;
|
|
14 taskQueueImpl = new TaskQueueInfo;
|
|
15 htaskImpl = new HTaskInfo;
|
46
|
16
|
63
|
17 taskListImpl->init(machineNum*2);
|
|
18 taskQueueImpl->init(TASK_MAX_SIZE*4);
|
46
|
19 htaskImpl->init(TASK_MAX_SIZE*2);
|
|
20
|
63
|
21 mainTaskList = taskListImpl->create();
|
46
|
22 }
|
|
23
|
|
24 TaskQueuePtr
|
|
25 BufferManager::create_taskQueue(HTaskPtr task)
|
|
26 {
|
63
|
27 return taskQueueImpl->create(task);
|
46
|
28 }
|
|
29
|
|
30 HTaskPtr
|
54
|
31 BufferManager::create_task(int cmd, int siz, DmaBuffer *in, DmaBuffer *out)
|
46
|
32 {
|
54
|
33 return htaskImpl->create(cmd, siz, in, out);
|
46
|
34 }
|
|
35
|
|
36 void
|
|
37 BufferManager::free_taskQueue(TaskQueuePtr q)
|
|
38 {
|
63
|
39 taskQueueImpl->free(q);
|
46
|
40 }
|
|
41
|
|
42 void
|
|
43 BufferManager::free_task(HTaskPtr task)
|
|
44 {
|
|
45 htaskImpl->free(task);
|
|
46 }
|
|
47
|
|
48 void
|
|
49 BufferManager::append_activeTask(HTaskPtr task)
|
|
50 {
|
|
51 TaskQueuePtr q;
|
|
52
|
63
|
53 q = taskQueueImpl->create(task);
|
|
54 activeTaskQueue = taskQueueImpl->append(activeTaskQueue, q);
|
46
|
55 }
|
|
56
|
|
57 void
|
|
58 BufferManager::finish(void)
|
|
59 {
|
63
|
60 delete taskListImpl;
|
|
61 delete taskQueueImpl;
|
46
|
62 delete htaskImpl;
|
|
63 }
|
|
64
|
63
|
65 /**
|
|
66 * waitTaskList って別で持つ必要あるのかな。
|
|
67 * ここでいう wait ってのは依存のことで、
|
|
68 * 依存される? task はすでにこの task を持っているわけだから。
|
|
69 * わざわざ waitTaskList を持つ必要は無い。
|
|
70 * けど、OS とかだと依存とかじゃない wait もあるんだよな。
|
|
71 * 消す必要は無いか。
|
|
72 */
|
46
|
73 void
|
|
74 BufferManager::append_waitTask(HTaskPtr task)
|
|
75 {
|
63
|
76 //TaskQueuePtr q;
|
46
|
77
|
63
|
78 //q = taskQueueImpl->create(task);
|
|
79 //waitTaskQueue = taskQueueImpl->append(waitTaskQueue, q);
|
46
|
80 }
|
|
81
|
|
82 void
|
|
83 BufferManager::check_task_finish(HTaskPtr task)
|
|
84 {
|
|
85 notify_wait_taskQueue(task, task->wait_me);
|
|
86 task->post_func();
|
|
87
|
|
88 htaskImpl->free(task);
|
|
89 }
|
|
90
|
|
91 void
|
|
92 BufferManager::notify_wait_taskQueue(HTaskPtr depend, TaskQueuePtr list)
|
|
93 {
|
|
94 TaskQueuePtr p, d;
|
|
95 HTaskPtr task;
|
|
96
|
|
97 p = list; // wait task list
|
|
98
|
|
99 while (p) {
|
|
100 task = p->task;
|
|
101 task->wait_i = remove_taskQueue_eq_task(task->wait_i, depend);
|
|
102 if (task->wait_i == NULL) {
|
|
103 d = p;
|
|
104 p = p->next;
|
|
105 append_activeTask(task);
|
63
|
106 //waitTaskQueue = remove_taskQueue(waitTaskQueue, d);
|
46
|
107 } else {
|
|
108 p = p->next;
|
|
109 }
|
|
110 }
|
|
111 }
|
|
112
|
|
113 TaskQueuePtr
|
|
114 BufferManager::remove_taskQueue_eq_task(TaskQueuePtr list, HTaskPtr task)
|
|
115 {
|
|
116 TaskQueuePtr p = list;
|
|
117 TaskQueuePtr p1;
|
|
118
|
|
119 if (!p) return p;
|
|
120
|
|
121 if (p->task == task) {
|
|
122 list = list->next;
|
63
|
123 taskQueueImpl->free(p);
|
46
|
124 } else {
|
|
125 p1 = p->next;
|
|
126 while (p1 && p1->task && p1->task != task) {
|
|
127 p1 = p1->next;
|
|
128 p = p->next;
|
|
129 }
|
|
130 if (p1) {
|
|
131 p->next = p1->next;
|
63
|
132 taskQueueImpl->free(p1);
|
46
|
133 }
|
|
134 }
|
|
135
|
|
136 return list;
|
|
137 }
|
|
138
|
|
139 TaskQueuePtr
|
|
140 BufferManager::remove_taskQueue(TaskQueuePtr list, TaskQueuePtr q)
|
|
141 {
|
|
142 TaskQueuePtr p = list;
|
|
143 TaskQueuePtr p1;
|
|
144
|
|
145 if (!p) return p;
|
|
146
|
|
147 if (p == q) {
|
|
148 list = list->next;
|
63
|
149 taskQueueImpl->free(p);
|
46
|
150 } else {
|
|
151 p1 = p->next;
|
|
152 while (p1 && p1 != q) {
|
|
153 p1 = p1->next;
|
|
154 p = p->next;
|
|
155 }
|
|
156 if (p1) {
|
|
157 p->next = p1->next;
|
63
|
158 taskQueueImpl->free(p1);
|
46
|
159 }
|
|
160 }
|
|
161
|
|
162 return list;
|
|
163 }
|
|
164
|
|
165 TaskListPtr
|
|
166 BufferManager::get_available_taskList(void)
|
|
167 {
|
|
168 TaskListPtr list, q;
|
|
169
|
63
|
170 list = mainTaskList;
|
46
|
171
|
|
172 while (list->next) list = list->next;
|
|
173
|
|
174 if (list->length < TASK_MAX_SIZE) {
|
|
175 return list;
|
|
176 } else {
|
63
|
177 q = taskListImpl->create();
|
|
178 mainTaskList = taskListImpl->append(mainTaskList, q);
|
46
|
179 return q;
|
|
180 }
|
|
181 }
|
|
182
|
|
183 void
|
|
184 BufferManager::clear_taskList(void)
|
|
185 {
|
|
186 TaskListPtr p, p1;
|
|
187
|
63
|
188 mainTaskList->length = 0;
|
46
|
189
|
63
|
190 p = mainTaskList->next;
|
46
|
191 while (p) {
|
|
192 p1 = p;
|
|
193 p = p->next;
|
63
|
194 taskListImpl->free(p1);
|
46
|
195 }
|
|
196 }
|