2 #include "structdefs.h"
3 #include "pmc_forward.h"
4 #include "pmc_refupdate.h"
7 #define pmcupdateObj(objptr) ((void *)((struct ___Object___ *)objptr)->marked)
9 #define PMCUPDATEOBJ(obj) {void *updatetmpptr=obj; if (updatetmpptr!=NULL) {obj=pmcupdateObj(updatetmpptr);}}
11 #define PMCUPDATEOBJNONNULL(obj) {void *updatetmpptr=obj; obj=pmcupdateObj(updatetmpptr);}
13 void pmc_updatePtrs(void *ptr, int type) {
14 unsigned int * pointer=pointerarray[type];
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]);
25 unsigned int size=pointer[0];
27 for(int i=1; i<=size; i++) {
28 unsigned int offset=pointer[i];
29 PMCUPDATEOBJ(*((void **)(((char *)ptr)+offset)));
34 void pmc_doreferenceupdate() {
35 struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE];
36 pmc_referenceupdate(region->startptr, region->endptr);
39 void pmc_referenceupdate(void *bottomptr, void *topptr) {
40 void *tmpptr=bottomptr;
41 while(tmpptr<topptr) {
44 gettype_size(tmpptr, &type, &size);
46 tmpptr+=ALIGNMENTSIZE;
49 //if marked we update the pointers
50 if (((struct ___Object___ *) tmpptr)->marked) {
51 pmc_updatePtrs(tmpptr, type);
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);
63 void pmc_compact(struct pmc_region * region, int forward, void *bottomptr, void *topptr) {
65 void *tmpptr=bottomptr;
66 while(tmpptr<topptr) {
69 gettype_size(tmpptr, &type, &size);
71 tmpptr+=ALIGNMENTSIZE;
74 //if marked we update the pointers
75 void *forwardptr=(void *)((struct ___Object___ *) tmpptr)->marked;
76 ((struct ___Object___ *) tmpptr)->marked=NULL;
78 memmove(forwardptr, tmpptr, size);
83 struct ___Object___ *backward=region->lastobj;
84 struct ___Object___ *lastobj=NULL;
87 backward=backward->lastobj;
90 gettype_size(tmpptr, &type, &size);
91 void *forwardptr=(void *)((struct ___Object___ *) lastobj)->marked;
92 ((struct ___Object___ *) lastobj)->marked=NULL;
94 memmove(forwardptr, lastobj, size);