annotate TaskManager/kernel/ppe/BufferManager.cc @ 63:54355e641172

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