// init the orig ptr
orig->localblocknum = 0;
orig->ptr=orig->base = to->base;
- orig->bound = orig->base + BLOCKSIZE(orig->localblocknum);
+ orig->bound=orig->base+BLOCKSIZE(orig->localblocknum);
#ifdef GC_CACHE_ADAPT
to->pagebound=to->base+BAMBOO_PAGE_SIZE;
orig->pagebound=orig->base+BAMBOO_PAGE_SIZE;
to->localblocknum++;
BASEPTR(to->base,BAMBOO_NUM_OF_CORE, to->localblocknum);
to->ptr=to->base;
- to->bound = to->base + BLOCKSIZE(to->localblocknum);
+ to->bound=to->base+BLOCKSIZE(to->localblocknum);
#ifdef GC_CACHE_ADAPT
to->pagebound=to->base+BAMBOO_PAGE_SIZE;
#endif
unsigned int globalblocknum;
BLOCKINDEX(globalblocknum, to->ptr);
to->base = gcbaseva + OFFSET2BASEVA(globalblocknum);
- to->bound = gcbaseva + BOUNDPTR(globalblocknum);
+ to->bound=gcbaseva+BOUNDPTR(globalblocknum);
#ifdef GC_CACHE_ADAPT
to->pagebound=(void *)((int)((int)(to->ptr)&(~(BAMBOO_PAGE_SIZE-1)))+BAMBOO_PAGE_SIZE);
#endif
void compacthelper(struct moveHelper * orig,struct moveHelper * to) {
bool senttopmessage=false;
while(true) {
- if ((gccurr_heaptop < ((unsigned INTPTR)(to->bound-to->ptr)))&&!senttopmessage) {
+ if ((gccurr_heaptop <= ((unsigned INTPTR)(to->bound-to->ptr)))&&!senttopmessage) {
//This block is the last for this core...let the startup know
if (BAMBOO_NUM_OF_CORE==STARTUPCORE) {
handleReturnMem(BAMBOO_NUM_OF_CORE, to->ptr+gccurr_heaptop);
orig->localblocknum++;
BASEPTR(orig->base,BAMBOO_NUM_OF_CORE, orig->localblocknum);
orig->ptr=orig->base;
- orig->bound = orig->base + BLOCKSIZE(orig->localblocknum);
+ orig->bound=orig->base+BLOCKSIZE(orig->localblocknum);
#ifdef GC_CACHE_ADAPT
orig->pagebound=orig->base+BAMBOO_PAGE_SIZE;
#endif
}
#ifdef GC_CACHE_ADAPT
-/* To compute access rate per pages, we need to compact to page boundary
- * instead of block boundary
- */
-unsigned int compactpages(struct moveHelper * orig, struct moveHelper * to) {
- void *toptrinit=to->ptr;
- void *toptr=toptrinit;
- void *tobound=to->bound;
- void *topagebound=to->pagebound;
+unsigned int compactblockshelper(struct moveHelper * orig, struct moveHelper * to) {
+ unsigned int minimumbytes=0;
void *origptr=orig->ptr;
- void *origpagebound=orig->pagebound;
- unsigned INTPTR origendoffset=ALIGNTOTABLEINDEX((unsigned INTPTR)(origpagebound-gcbaseva));
- unsigned int objlength;
- while((origptr<origpagebound)&&(toptr<topagebound)){
- //Try to skip over stuff fast first
- unsigned INTPTR offset=(unsigned INTPTR) (origptr-gcbaseva);
- unsigned INTPTR arrayoffset=ALIGNTOTABLEINDEX(offset);
- if (!gcmarktbl[arrayoffset]) {
- do {
- arrayoffset++;
- if (arrayoffset>=origendoffset) {
- //finished with a page...
- origptr=origpagebound;
- to->ptr=toptr;
- orig->ptr=origptr;
- orig->pagebound+=BAMBOO_PAGE_SIZE;
- gccurr_heaptop-=(unsigned INTPTR)(toptr-toptrinit);
- // close the last destination page
- CACHEADAPT_COMPLETE_PAGE_CONVERT(origptr, toptr, toptr);
- return 0;
- }
- } while(!gcmarktbl[arrayoffset]);
- origptr=CONVERTTABLEINDEXTOPTR(arrayoffset);
- }
-
- //Scan more carefully next
- objlength=getMarkedLength(origptr);
-
- if (objlength!=NOTMARKED) {
- unsigned int length=ALIGNSIZETOBYTES(objlength);
+ void *origbound=orig->bound;
+ void * tmporig=orig->ptr;
+ void * tmpto=to->ptr;
- //code between this and next comment should be removed
-#ifdef GC_DEBUG
- unsigned int size;
- unsigned int type;
- gettype_size(origptr, &type, &size);
- size=((size-1)&(~(ALIGNMENTSIZE-1)))+ALIGNMENTSIZE;
-
- if (size!=length) {
- tprintf("BAD SIZE IN BITMAP: type=%u object=%x size=%u length=%u\n", type, origptr, size, length);
- unsigned INTPTR alignsize=ALIGNOBJSIZE((unsigned INTPTR)(origptr-gcbaseva));
- unsigned INTPTR hibits=alignsize>>4;
- unsigned INTPTR lobits=(alignsize&15)<<1;
- tprintf("hibits=%x lobits=%x\n", hibits, lobits);
- tprintf("hi=%x lo=%x\n", gcmarktbl[hibits], gcmarktbl[hibits+1]);
+ while(true) {
+ //call compactblocks using the page boundaries at the current bounds
+ minimumbytes=compactblocks(orig, to);
+ if(minimumbytes == 0) {
+ //bump the orig page bound...
+ //use old orig pointer to make sure we get correct block
+ CACHEADAPT_FINISH_SRC_PAGE(tmporig, tmpto, to->ptr);
+ if (orig->ptr<origbound) {
+ tmporig=orig->ptr;
+ tmpto=to->ptr;
+ orig->pagebound=orig->pagebound+BAMBOO_PAGE_SIZE;
+ } else {
+ return 0;
}
-#endif
- //end of code to remove
-
- void *endtoptr=toptr+length;
- if (endtoptr>tobound) {
- gccurr_heaptop-=(unsigned INTPTR)(toptr-toptrinit);
- to->ptr=tobound;
- orig->ptr=origptr;
- // close a destination page, update the revise profiling info
- CACHEADAPT_COMPLETE_PAGE_CONVERT(origptr, tobound, toptr);
- return length;
+ } else {
+ // require more memory
+ void *endtoptr=to->ptr+minimumbytes;
+ if (endtoptr>to->bound) {
+ CACHEADAPT_FINISH_DST_PAGE(orig->ptr, tmpto, to->ptr, 0);
+ return minimumbytes;
+ } else {
+ CACHEADAPT_FINISH_DST_PAGE(orig->ptr, tmpto, to->ptr, minimumbytes);
+ to->pagebound=((endtoptr-1)&~(BAMBOO_PAGE_SIZE-1))+BAMBOO_PAGE_SIZE;
+ //update pointers to avoid double counting the stuff we already added in
+ tmporig=orig->ptr+minimumbytes;
+ tmpto=to->ptr+minimumbytes;
}
- //good to move objects and update pointers
- //tprintf("Decided to compact obj %x to %x\n", origptr, toptr);
-
- gcmappingtbl[OBJMAPPINGINDEX(origptr)]=toptr;
-
- origptr+=length;
- toptr=endtoptr;
- } else
- origptr+=ALIGNMENTSIZE;
+ }
}
- to->ptr=toptr;
- orig->ptr=origptr;
- orig->pagebound=(void *)((int)(((int)origptr)&(~(BAMBOO_PAGE_SIZE-1)))+BAMBOO_PAGE_SIZE);
- to->pagebound=(void *)((int)(((int)toptr)&(~(BAMBOO_PAGE_SIZE-1)))+BAMBOO_PAGE_SIZE);
- gccurr_heaptop-=(unsigned INTPTR)(toptr-toptrinit);
- // close the last destination page
- CACHEADAPT_COMPLETE_PAGE_CONVERT(origptr, toptr, toptr);
- return 0;
}
+#endif
-#else
/* This function is performance critical... spend more time optimizing it */
unsigned int compactblocks(struct moveHelper * orig, struct moveHelper * to) {
void *toptrinit=to->ptr;
void *toptr=toptrinit;
- void *tobound=to->bound;
void *origptr=orig->ptr;
+#ifdef GC_CACHE_ADAPT
+ void *origbound=orig->pagebound;
+ void *tobound=to->pagebound;
+#else
void *origbound=orig->bound;
+ void *tobound=to->bound;
+#endif
unsigned INTPTR origendoffset=ALIGNTOTABLEINDEX((unsigned INTPTR)(origbound-gcbaseva));
unsigned int objlength;
+
while(origptr<origbound) {
//Try to skip over stuff fast first
unsigned INTPTR offset=(unsigned INTPTR) (origptr-gcbaseva);
do {
arrayoffset++;
if (arrayoffset>=origendoffset) {
- //finished with block...
- origptr=origbound;
+ //finished with block(a page in CACHE_ADAPT version)...
to->ptr=toptr;
- orig->ptr=origptr;
+ orig->ptr=origbound;
gccurr_heaptop-=(unsigned INTPTR)(toptr-toptrinit);
return 0;
}
} while(!gcmarktbl[arrayoffset]);
origptr=CONVERTTABLEINDEXTOPTR(arrayoffset);
}
-
+
//Scan more carefully next
objlength=getMarkedLength(origptr);
void *endtoptr=toptr+length;
if (endtoptr>tobound) {
- gccurr_heaptop-=(unsigned INTPTR)(toptr-toptrinit);
- to->ptr=tobound;
+ gccurr_heaptop-=(unsigned INTPTR)(toptr-toptrinit);
+ to->ptr=toptr;
orig->ptr=origptr;
return length;
}
//good to move objects and update pointers
-
+
gcmappingtbl[OBJMAPPINGINDEX(origptr)]=toptr;
-
+
origptr+=length;
toptr=endtoptr;
} else
return 0;
}
-#endif
-
void compact() {
BAMBOO_ASSERT(COMPACTPHASE == gc_status_info.gcphase);