1 #include "pmc_forward.h"
2 #include "pmc_refupdate.h"
4 #define pmcupdateObj(objptr) ((void *)((struct ___Object___ *)objptr)->mark)
6 #define PMCUPDATEOBJ(obj) {void *updatetmpptr=obj; if (updatetmpptr!=NULL) {obj=pmcupdateObj(updatetmpptr);}}
8 #define PMCUPDATEOBJNONNULL(obj) {void *updatetmpptr=obj; obj=pmcupdateObj(updatetmpptr);}
10 void pmc_updatePtrs(void *ptr, int type) {
11 unsigned int * pointer=pointerarray[type];
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]);
22 unsigned int size=pointer[0];
24 for(int i=1; i<=size; i++) {
25 unsigned int offset=pointer[i];
26 PMCUPDATEOBJ(*((void **)(((char *)ptr)+offset)));
31 void pmc_doreferenceupdate() {
32 struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE];
33 pmc_referenceupdate(region->startptr, region->endptr);
36 void pmc_referenceupdate(void *bottomptr, void *topptr) {
37 void *tmpptr=bottomptr;
38 while(tmpptr<topptr) {
41 gettype_size(tmpptr, &type, &size);
43 tmpptr+=ALIGNMENTSIZE;
46 //if marked we update the pointers
47 if (((struct ___Object___ *) tmpptr)->mark) {
48 pmc_updatePtrs(tmpptr, type);
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);
60 void pmc_compact(struct pmc_region * region, int forward, void *bottomptr, void *topptr) {
62 void *tmpptr=bottomptr;
63 while(tmpptr<topptr) {
66 gettype_size(tmpptr, &type, &size);
68 tmpptr+=ALIGNMENTSIZE;
71 //if marked we update the pointers
72 void *forwardptr=(void *)((struct ___Object___ *) tmpptr)->mark;
73 ((struct ___Object___ *) tmpptr)->mark=NULL;
75 memmove(forwardptr, tmpptr, size);
80 struct ___Object___ *backward=region->lastobj;
81 struct ___Object___ *lastobj=NULL;
84 backward=backward->lastobj;
87 gettype_size(tmpptr, &type, &size);
88 void *forwardptr=(void *)((struct ___Object___ *) lastobj)->mark;
89 ((struct ___Object___ *) lastobj)->mark=NULL;
91 memmove(forwardptr, lastobj, size);