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