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