2 #include "structdefs.h"
3 #include "bambooalign.h"
4 #include "runtime_arch.h"
5 #include "pmc_forward.h"
6 #include "pmc_refupdate.h"
9 #define pmcupdateObj(objptr) ((void *)((struct ___Object___ *)objptr)->marked)
11 #define PMCUPDATEOBJ(obj) {void *updatetmpptr=obj; if (updatetmpptr!=NULL) {obj=pmcupdateObj(updatetmpptr);}}
13 #define PMCUPDATEOBJNONNULL(obj) {void *updatetmpptr=obj; obj=pmcupdateObj(updatetmpptr);}
15 void pmc_updatePtrs(void *ptr, int type) {
16 unsigned int * pointer=pointerarray[type];
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]);
27 unsigned int size=pointer[0];
29 for(int i=1; i<=size; i++) {
30 unsigned int offset=pointer[i];
31 PMCUPDATEOBJ(*((void **)(((char *)ptr)+offset)));
36 void pmc_doreferenceupdate() {
37 struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE];
38 pmc_referenceupdate(region->startptr, region->endptr);
41 void pmc_referenceupdate(void *bottomptr, void *topptr) {
42 void *tmpptr=bottomptr;
43 while(tmpptr<topptr) {
46 gettype_size(tmpptr, &type, &size);
48 tmpptr+=ALIGNMENTSIZE;
51 //if marked we update the pointers
52 if (((struct ___Object___ *) tmpptr)->marked) {
53 pmc_updatePtrs(tmpptr, type);
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);
65 void pmc_compact(struct pmc_region * region, int forward, void *bottomptr, void *topptr) {
67 void *tmpptr=bottomptr;
68 while(tmpptr<topptr) {
71 gettype_size(tmpptr, &type, &size);
73 tmpptr+=ALIGNMENTSIZE;
76 //if marked we update the pointers
77 void *forwardptr=(void *)((struct ___Object___ *) tmpptr)->marked;
78 ((struct ___Object___ *) tmpptr)->marked=NULL;
80 memmove(forwardptr, tmpptr, size);
85 struct ___Object___ *backward=((struct ___Object___ *) region)->backward;
86 struct ___Object___ *lastobj=NULL;
89 backward=backward->backward;
92 gettype_size(lastobj, &type, &size);
93 void *forwardptr=(void *)((struct ___Object___ *) lastobj)->marked;
94 ((struct ___Object___ *) lastobj)->marked=NULL;
96 memmove(forwardptr, lastobj, size);