be58e88cc30209b7d25b009f8c726537924b423f
[IRC.git] / Robust / src / Runtime / bamboo / pmc_refupdate.c
1 #include <stdlib.h>
2 #include "structdefs.h"
3 #include "pmc_forward.h"
4 #include "pmc_refupdate.h"
5
6
7 #define pmcupdateObj(objptr) ((void *)((struct ___Object___ *)objptr)->marked)
8
9 #define PMCUPDATEOBJ(obj) {void *updatetmpptr=obj; if (updatetmpptr!=NULL) {obj=pmcupdateObj(updatetmpptr);}}
10
11 #define PMCUPDATEOBJNONNULL(obj) {void *updatetmpptr=obj; obj=pmcupdateObj(updatetmpptr);}
12
13 void pmc_updatePtrs(void *ptr, int type) {
14   unsigned int * pointer=pointerarray[type];
15   if (pointer==0) {
16     /* Array of primitives */
17   } else if (((unsigned int)pointer)==1) {
18     /* Array of pointers */
19     struct ArrayObject *ao=(struct ArrayObject *) ptr;
20     int length=ao->___length___;
21     for(int j=0; j<length; j++) {
22       PMCUPDATEOBJ(((void **)(((char *)&ao->___length___)+sizeof(int)))[j]);
23     }
24   } else {
25     unsigned int size=pointer[0];
26     
27     for(int i=1; i<=size; i++) {
28       unsigned int offset=pointer[i];
29       PMCUPDATEOBJ(*((void **)(((char *)ptr)+offset)));
30     }
31   }  
32 }
33
34 void pmc_doreferenceupdate() {
35   struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE];
36   pmc_referenceupdate(region->startptr, region->endptr);
37 }
38
39 void pmc_referenceupdate(void *bottomptr, void *topptr) {
40   void *tmpptr=bottomptr;
41   while(tmpptr<topptr) {
42     unsigned int type;
43     unsigned int size;
44     gettype_size(tmpptr, &type, &size);
45     if (!type) {
46       tmpptr+=ALIGNMENTSIZE;
47       continue;
48     }
49     //if marked we update the pointers
50     if (((struct ___Object___ *) tmpptr)->marked) {
51       pmc_updatePtrs(tmpptr, type);
52     }
53     tmpptr+=size;
54   }
55 }
56
57 void pmc_docompact() {
58   struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE];
59   pmc_compact(region, !(BAMBOO_NUM_OF_CORE&1), region->startptr, region->endptr);
60 }
61
62
63 void pmc_compact(struct pmc_region * region, int forward, void *bottomptr, void *topptr) {
64   if (forward) {
65     void *tmpptr=bottomptr;
66     while(tmpptr<topptr) {
67       unsigned int type;
68       unsigned int size;
69       gettype_size(tmpptr, &type, &size);
70       if (!type) {
71         tmpptr+=ALIGNMENTSIZE;
72         continue;
73       }
74       //if marked we update the pointers
75       void *forwardptr=(void *)((struct ___Object___ *) tmpptr)->marked;
76       ((struct ___Object___ *) tmpptr)->marked=NULL;
77       if (forwardptr) {
78         memmove(forwardptr, tmpptr, size);
79       }
80       tmpptr+=size;
81     }
82   } else {
83     struct ___Object___ *backward=region->lastobj;
84     struct ___Object___ *lastobj=NULL;
85     while(backward) {
86       lastobj=backward;
87       backward=backward->lastobj;
88       unsigned int type;
89       unsigned int size;
90       gettype_size(tmpptr, &type, &size);
91       void *forwardptr=(void *)((struct ___Object___ *) lastobj)->marked;
92       ((struct ___Object___ *) lastobj)->marked=NULL;
93       if (forwardptr) {
94         memmove(forwardptr, lastobj, size);
95       }
96     }
97   }
98 }