1e4eaa87a15ea0050218f5b62163c623384287b3
[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     void *lastptr;
64     while(tmpptr<topptr) {
65       unsigned int type;
66       unsigned int size;
67       gettype_size(tmpptr, &type, &size);
68       if (!type) {
69         tmpptr+=ALIGNMENTSIZE;
70         continue;
71       }
72       //if marked we update the pointers
73       void *forwardptr=(void *)((struct ___Object___ *) tmpptr)->mark;
74       ((struct ___Object___ *) tmpptr)->mark=NULL;
75       if (forwardptr) {
76         memmove(forwardptr, tmpptr, size);
77       }
78       lastptr=forwardptr+size;
79       tmpptr+=size;
80     }
81     region->lastptr=lastptr;
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)->mark;
92       ((struct ___Object___ *) lastobj)->mark=NULL;
93       if (forwardptr) {
94         memmove(forwardptr, lastobj, size);
95       }
96     }
97   }
98 }