more changes...think it is done...just need to wire it in to the build...
authorbdemsky <bdemsky>
Tue, 5 Jul 2011 23:46:26 +0000 (23:46 +0000)
committerbdemsky <bdemsky>
Tue, 5 Jul 2011 23:46:26 +0000 (23:46 +0000)
Robust/src/Runtime/bamboo/pmc_forward.c
Robust/src/Runtime/bamboo/pmc_garbage.c
Robust/src/Runtime/bamboo/pmc_garbage.h
Robust/src/Runtime/bamboo/pmc_refupdate.c

index 41f23645093baaedfb143e6fc8002f88a2e62738..84c3e2a353dd4a76db228fba6db6ddc9e36d3bd6 100644 (file)
@@ -55,6 +55,32 @@ void pmc_processunits() {
   }
 }
 
+void pmc_doforward() {
+  int startregion=-1;
+  int endregion=-1;
+  unsigned int totalbytes=0;
+  struct pmc_region * region=&pmc_heapptr->regions[BAMBOO_NUM_OF_CORE];
+  for(int i=0;i<NUMPMCUNITS;i++) {
+    if (startregion==-1&&BAMBOO_NUM_OF_CORE==pmc_heapptr->units[i].regionnum) {
+      startregion=i;
+    }
+    if (BAMBOO_NUM_OF_CORE<pmc_heapptr->units[i].regionnum) {
+      endregion=i;
+      break;
+    }
+    if (startregion!=-1) {
+      totalbytes+=pmc_heapptr->units[i].numbytes;
+    }
+  }
+  if (startregion==-1) 
+    return;
+  if (endregion==-1)
+    endregion=NUMPMCUNITS;
+  region->startptr=gcbaseva+startregion*UNITSIZE;
+  region->endptr=gcbaseva+endregion*UNITSIZE;
+  pmc_forward(region, totalbytes, region->startptr, region->endptr, BAMBOO_NUM_OF_CORE&1);
+}
+
 
 void pmc_forward(struct pmc_region *region, unsigned int totalbytes, void *bottomptr, void *topptr, bool fwddirection) {
   void *tmpptr=bottomptr;
index 6e13da82ef32933437abf2e3a1b12835903222c5..4d0d747217643d0f377971b4be2a39b8fd899e9f 100644 (file)
@@ -29,12 +29,23 @@ void pmc_init() {
 
 void gc(struct garbagelist *gl) {
   pmc_init();
+  //mark live objects
   pmc_mark(gl);
+  //count live objects per unit
   pmc_count();
   tmc_spin_barrier_wait(&pmc_heapptr->barrier);
+  //divide up work
   if (BAMBOO_NUM_OF_THREADS==STARTUPCORE) {
     pmc_processunits();
   }
   tmc_spin_barrier_wait(&pmc_heapptr->barrier);
-  
+  //set up forwarding pointers
+  pmc_doforward();
+  tmc_spin_barrier_wait(&pmc_heapptr->barrier);
+  //update pointers
+  pmc_doreferenceupdate();
+  tmc_spin_barrier_wait(&pmc_heapptr->barrier);
+  //compact data
+  pmc_docompact();
+  tmc_spin_barrier_wait(&pmc_heapptr->barrier);
 }
index d0a33a428e6c99801d27dfb941f913214e699f43..3158dcb0166e30c1326db4d68cb62a57b9be75e0 100644 (file)
@@ -13,6 +13,8 @@ struct pmc_unit {
 
 struct pmc_region {
   void * lastptr;
+  void * startptr;
+  void * endptr;
   struct ___Object___ * lastobj;
   struct pmc_queue markqueue;
 };
index 780d615de574719f7e8e13d911a3623eea6f6dc6..1e4eaa87a15ea0050218f5b62163c623384287b3 100644 (file)
@@ -28,6 +28,11 @@ void pmc_updatePtrs(void *ptr, int type) {
   }  
 }
 
+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) {
@@ -46,6 +51,11 @@ void pmc_referenceupdate(void *bottomptr, void *topptr) {
   }
 }
 
+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) {