9 unsigned int ptrs[NUMPTRS];
10 struct pointerblock *next;
13 #define NUMLOBJPTRS 20
15 struct lobjpointerblock {
16 unsigned int lobjs[NUMLOBJPTRS];
17 int lengths[NUMLOBJPTRS];
18 int hosts[NUMLOBJPTRS];
19 struct lobjpointerblock *next;
20 struct lobjpointerblock *prev;
23 extern struct pointerblock *gchead;
24 extern int gcheadindex;
25 extern struct pointerblock *gctail;
26 extern int gctailindex;
27 extern struct pointerblock *gctail2;
28 extern int gctailindex2;
29 extern struct pointerblock *gcspare;
31 extern struct lobjpointerblock *gclobjhead;
32 extern int gclobjheadindex;
33 extern struct lobjpointerblock *gclobjtail;
34 extern int gclobjtailindex;
35 extern struct lobjpointerblock *gclobjtail2;
36 extern int gclobjtailindex2;
37 extern struct lobjpointerblock *gclobjspare;
39 static void gc_queueinit() {
42 gcheadindex=gctailindex=gctailindex2 = 0;
43 gchead=gctail=gctail2=RUNMALLOC(sizeof(struct pointerblock));
45 gctailindex=gctailindex2=gcheadindex=0;
46 gctail=gctail2=gchead;
49 // initialize the large obj queues
50 if (gclobjhead==NULL) {
54 gclobjhead=gclobjtail=gclobjtail2=RUNMALLOC(sizeof(struct lobjpointerblock));
56 gclobjtailindex=gclobjtailindex2=gclobjheadindex=0;
57 gclobjtail=gclobjtail2=gclobjhead;
59 gclobjhead->next=gclobjhead->prev=NULL;
62 ////////////////////////////////////////////////////////////////////
63 // functions that should be invoked with interrupts off
64 ////////////////////////////////////////////////////////////////////
65 static void gc_enqueue_I(unsigned int ptr) {
66 if (gcheadindex==NUMPTRS) {
67 struct pointerblock * tmp;
73 tmp=RUNMALLOC_I(sizeof(struct pointerblock));
79 gchead->ptrs[gcheadindex++]=ptr;
82 // dequeue and destroy the queue
83 static unsigned int gc_dequeue_I() {
84 if (gctailindex==NUMPTRS) {
85 struct pointerblock *tmp=gctail;
95 return gctail->ptrs[gctailindex++];
98 // dequeue and do not destroy the queue
99 static unsigned int gc_dequeue2_I() {
100 if (gctailindex2==NUMPTRS) {
101 struct pointerblock *tmp=gctail2;
102 gctail2=gctail2->next;
105 return gctail2->ptrs[gctailindex2++];
108 static int gc_moreItems_I() {
109 return !((gchead==gctail)&&(gctailindex==gcheadindex));
112 static int gc_moreItems2_I() {
113 return !((gchead==gctail2)&&(gctailindex2==gcheadindex));
116 // should be invoked with interruption closed
117 // enqueue a large obj: start addr & length
118 static void gc_lobjenqueue_I(unsigned int ptr,
121 if (gclobjheadindex==NUMLOBJPTRS) {
122 struct lobjpointerblock * tmp;
123 if (gclobjspare!=NULL) {
129 tmp=RUNMALLOC_I(sizeof(struct lobjpointerblock));
131 gclobjhead->next=tmp;
132 tmp->prev = gclobjhead;
136 gclobjhead->lobjs[gclobjheadindex]=ptr;
137 gclobjhead->lengths[gclobjheadindex]=length;
138 gclobjhead->hosts[gclobjheadindex++]=host;
141 // dequeue and destroy the queue
142 static unsigned int gc_lobjdequeue_I(unsigned int * length,
143 unsigned int * host) {
144 if (gclobjtailindex==NUMLOBJPTRS) {
145 struct lobjpointerblock *tmp=gclobjtail;
146 gclobjtail=gclobjtail->next;
148 gclobjtail->prev = NULL;
149 if (gclobjspare!=NULL) {
158 *length = gclobjtail->lengths[gclobjtailindex];
161 *host = (unsigned int)(gclobjtail->hosts[gclobjtailindex]);
163 return gclobjtail->lobjs[gclobjtailindex++];
166 static int gc_lobjmoreItems_I() {
167 return !((gclobjhead==gclobjtail)&&(gclobjtailindex==gclobjheadindex));
170 // dequeue and don't destroy the queue
171 static void gc_lobjdequeue2_I() {
172 if (gclobjtailindex2==NUMLOBJPTRS) {
173 gclobjtail2=gclobjtail2->next;
180 static int gc_lobjmoreItems2_I() {
181 return !((gclobjhead==gclobjtail2)&&(gclobjtailindex2==gclobjheadindex));
184 // 'reversly' dequeue and don't destroy the queue
185 static void gc_lobjdequeue3_I() {
186 if (gclobjtailindex2==0) {
187 gclobjtail2=gclobjtail2->prev;
188 gclobjtailindex2=NUMLOBJPTRS-1;
194 static int gc_lobjmoreItems3_I() {
195 return !((gclobjtail==gclobjtail2)&&(gclobjtailindex2==gclobjtailindex));
198 static void gc_lobjqueueinit4_I() {
199 gclobjtail2 = gclobjtail;
200 gclobjtailindex2 = gclobjtailindex;
203 static unsigned int gc_lobjdequeue4_I(unsigned int * length,
204 unsigned int * host) {
205 if (gclobjtailindex2==NUMLOBJPTRS) {
206 gclobjtail2=gclobjtail2->next;
210 *length = gclobjtail2->lengths[gclobjtailindex2];
213 *host = (unsigned int)(gclobjtail2->hosts[gclobjtailindex2]);
215 return gclobjtail2->lobjs[gclobjtailindex2++];
218 static int gc_lobjmoreItems4_I() {
219 return !((gclobjhead==gclobjtail2)&&(gclobjtailindex2==gclobjheadindex));
222 ////////////////////////////////////////////////////////////////////
223 // functions that can be invoked in normal places
224 ////////////////////////////////////////////////////////////////////
225 static void gc_enqueue(unsigned int ptr) {
226 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
227 if (gcheadindex==NUMPTRS) {
228 struct pointerblock * tmp;
234 tmp=RUNMALLOC_I(sizeof(struct pointerblock));
240 gchead->ptrs[gcheadindex++]=ptr;
241 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
244 static unsigned int gc_dequeue() {
245 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
246 if (gctailindex==NUMPTRS) {
247 struct pointerblock *tmp=gctail;
254 gcspare->next = NULL;
257 unsigned int r = gctail->ptrs[gctailindex++];
258 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
262 static int gc_moreItems() {
263 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
264 int r = !((gchead==gctail)&&(gctailindex==gcheadindex));
265 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
269 // dequeue and do not destroy the queue
270 static unsigned int gc_dequeue2() {
271 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
272 if (gctailindex2==NUMPTRS) {
273 struct pointerblock *tmp=gctail2;
274 gctail2=gctail2->next;
277 unsigned int r = gctail2->ptrs[gctailindex2++];
278 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
282 static int gc_moreItems2() {
283 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
284 int r = !((gchead==gctail2)&&(gctailindex2==gcheadindex));
285 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();
289 static void gc_lobjenqueue(unsigned int ptr,
292 BAMBOO_ENTER_RUNTIME_MODE_FROM_CLIENT();
293 if (gclobjheadindex==NUMLOBJPTRS) {
294 struct lobjpointerblock * tmp;
295 if (gclobjspare!=NULL) {
301 tmp=RUNMALLOC_I(sizeof(struct lobjpointerblock));
303 gclobjhead->next=tmp;
304 tmp->prev = gclobjhead;
308 gclobjhead->lobjs[gclobjheadindex]=ptr;
309 gclobjhead->lengths[gclobjheadindex]=length;
310 gclobjhead->hosts[gclobjheadindex++]=host;
311 BAMBOO_ENTER_CLIENT_MODE_FROM_RUNTIME();