towards fixing bugs...
[IRC.git] / Robust / src / Runtime / bamboo / multicoregccompact.c
index e52ace57a4037872300571123cb2439ca0569bc1..ea3264cf192b7d4434cf1b0a54e5b8521dafdfcf 100644 (file)
@@ -28,7 +28,7 @@ void initOrig_Dst(struct moveHelper * orig,struct moveHelper * to) {
   // 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;
@@ -40,7 +40,7 @@ void getSpaceLocally(struct moveHelper *to) {
   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
@@ -167,7 +167,7 @@ void getSpaceRemotely(struct moveHelper *to, unsigned int minimumbytes) {
   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
@@ -185,7 +185,7 @@ void getSpace(struct moveHelper *to, unsigned int minimumbytes) {
 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);
@@ -202,7 +202,7 @@ void compacthelper(struct moveHelper * orig,struct moveHelper * to) {
       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
@@ -363,104 +363,61 @@ void * gcfindSpareMem_I(unsigned INTPTR requiredmem, unsigned INTPTR desiredmem,
 } 
 
 #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);
@@ -469,17 +426,16 @@ unsigned int compactblocks(struct moveHelper * orig, struct moveHelper * to) {
       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);
 
@@ -506,15 +462,15 @@ unsigned int compactblocks(struct moveHelper * orig, struct moveHelper * to) {
 
       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
@@ -526,8 +482,6 @@ unsigned int compactblocks(struct moveHelper * orig, struct moveHelper * to) {
   return 0;
 }
 
-#endif
-
 void compact() {
   BAMBOO_ASSERT(COMPACTPHASE == gc_status_info.gcphase);