+#include <stdlib.h>
+#include "structdefs.h"
+#include "bambooalign.h"
+#include "runtime_arch.h"
#include "pmc_forward.h"
#include "pmc_refupdate.h"
-#define pmcupdateObj(objptr) ((void *)((struct ___Object___ *)objptr)->mark)
+
+#define pmcupdateObj(objptr) ((void *)((struct ___Object___ *)objptr)->marked)
#define PMCUPDATEOBJ(obj) {void *updatetmpptr=obj; if (updatetmpptr!=NULL) {obj=pmcupdateObj(updatetmpptr);}}
}
}
+void pmc_doreferenceupdate() {
+ struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE];
+ pmc_referenceupdate(region->startptr, region->endptr);
+}
+
void pmc_referenceupdate(void *bottomptr, void *topptr) {
void *tmpptr=bottomptr;
while(tmpptr<topptr) {
continue;
}
//if marked we update the pointers
- if (((struct ___Object___ *) tmpptr)->mark) {
+ if (((struct ___Object___ *) tmpptr)->marked) {
pmc_updatePtrs(tmpptr, type);
}
tmpptr+=size;
}
}
+void pmc_docompact() {
+ struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE];
+ pmc_compact(region, !(BAMBOO_NUM_OF_CORE&1), region->startptr, region->endptr);
+}
+
void pmc_compact(struct pmc_region * region, int forward, void *bottomptr, void *topptr) {
if (forward) {
void *tmpptr=bottomptr;
- void *lastptr;
while(tmpptr<topptr) {
unsigned int type;
unsigned int size;
continue;
}
//if marked we update the pointers
- void *forwardptr=(void *)((struct ___Object___ *) tmpptr)->mark;
- ((struct ___Object___ *) tmpptr)->mark=NULL;
+ void *forwardptr=(void *)((struct ___Object___ *) tmpptr)->marked;
+ ((struct ___Object___ *) tmpptr)->marked=NULL;
if (forwardptr) {
memmove(forwardptr, tmpptr, size);
}
- lastptr=forwardptr+size;
tmpptr+=size;
}
- region->lastptr=lastptr;
} else {
- struct ___Object___ *backward=region->lastobj;
+ struct ___Object___ *backward=((struct ___Object___ *) region)->backward;
struct ___Object___ *lastobj=NULL;
while(backward) {
lastobj=backward;
- backward=backward->lastobj;
+ backward=backward->backward;
unsigned int type;
unsigned int size;
- gettype_size(tmpptr, &type, &size);
- void *forwardptr=(void *)((struct ___Object___ *) lastobj)->mark;
- ((struct ___Object___ *) lastobj)->mark=NULL;
+ gettype_size(lastobj, &type, &size);
+ void *forwardptr=(void *)((struct ___Object___ *) lastobj)->marked;
+ ((struct ___Object___ *) lastobj)->marked=NULL;
if (forwardptr) {
memmove(forwardptr, lastobj, size);
}