towards fixing bugs...
[IRC.git] / Robust / src / Runtime / bamboo / multicoregarbage.c
index 8416a52731eee2af39fbfb1576c41fd98c01ac87..3a42576892a38f6d8cbd0a2f52f5cc265fa8bd56 100644 (file)
@@ -9,6 +9,9 @@
 #include "gcqueue.h"
 #include "multicoremem_helper.h"
 #include "bambooalign.h"
+#ifdef PERFCOUNT
+#include "bme_perf_counter.h"
+#endif
 
 volatile bool gcflag;
 gc_status_t gc_status_info;
@@ -87,6 +90,22 @@ void dumpSMem() {
 }
 #endif
 
+bool gc_checkCoreStatus() {
+  for(int i = 0; i < NUMCORES4GC; i++) {
+    if(gccorestatus[i]) {
+      return false;
+    }
+  }
+  return true;
+}
+
+void gc_resetCoreStatus() {
+  for(int i = 0; i < NUMCORES4GC; i++) {
+    gccorestatus[i] = 1;
+  }
+}
+
+
 void initmulticoregcdata() {
   bamboo_smem_zero_top = NULL;
   gcflag = false;
@@ -98,9 +117,6 @@ void initmulticoregcdata() {
 #ifdef MGC_SPEC
   gc_profile_flag = false;
 #endif
-#ifdef GC_CACHE_ADAPT
-  gccachestage = false;
-#endif 
 
   if(STARTUPCORE == BAMBOO_NUM_OF_CORE) {
     allocationinfo.blocktable=RUNMALLOC(sizeof(struct blockrecord)*GCNUMBLOCK);
@@ -280,6 +296,8 @@ void gc_collect(struct garbagelist * stackptr) {
   WAITFORGCPHASE(MARKPHASE);
 
   GC_PRINTF("Start mark phase\n");
+  GCPROFILE_ITEM();
+
   mark(stackptr);
   GC_PRINTF("Finish mark phase, start compact phase\n");
   compact();
@@ -316,12 +334,15 @@ void gc_nocollect(struct garbagelist * stackptr) {
   GC_PRINTF("Do initGC\n");
   initGC();
   CACHEADAPT_GC(true);
+
   //send init finish msg to core coordinator
   send_msg_2(STARTUPCORE,GCFINISHINIT,BAMBOO_NUM_OF_CORE);
 
+
   WAITFORGCPHASE(MARKPHASE);
 
   GC_PRINTF("Start mark phase\n"); 
+  GCPROFILE_ITEM();
   mark(stackptr);
   GC_PRINTF("Finish mark phase, wait for update\n");
 
@@ -349,8 +370,8 @@ void gc_nocollect(struct garbagelist * stackptr) {
 void master_mark(struct garbagelist *stackptr) {
 
   GC_PRINTF("Start mark phase \n");
-  GC_SEND_MSG_1_TO_CLIENT(GCSTART);
   gc_status_info.gcphase = MARKPHASE;
+  GC_SEND_MSG_1_TO_CLIENT(GCSTART);
   // mark phase
 
   mark(stackptr);
@@ -418,7 +439,7 @@ void master_finish() {
 }
 
 void gc_master(struct garbagelist * stackptr) {
-  //tprintf("start GC!\n");
+  tprintf("start GC!\n");
   gc_status_info.gcprocessing = true;
   gc_status_info.gcphase = INITPHASE;
 
@@ -433,6 +454,7 @@ void gc_master(struct garbagelist * stackptr) {
   unsigned long long tmpt = BAMBOO_GET_EXE_TIME();
   CACHEADAPT_OUTPUT_CACHE_SAMPLING();
   gc_output_cache_policy_time += (BAMBOO_GET_EXE_TIME()-tmpt);
+  GCPROFILE_ITEM();
   //tprintf("start mark phase\n");
   // do mark phase
   master_mark(stackptr);
@@ -456,9 +478,10 @@ void gc_master(struct garbagelist * stackptr) {
     tprintf("%u. used=%u free=%u corenum=%u status=%u, base=%x, ptr=%x\n", i, record->usedspace, record->freespace, record->corenum, record->status, gcbaseva+OFFSET2BASEVA(i), (gcbaseva+OFFSET2BASEVA(i)+record->usedspace));
   }
 #endif
+
   master_finish();
 
-  //tprintf("finish GC ! %d \n",gcflag);
+  tprintf("finish GC ! %d \n",gcflag);
 } 
 
 void pregccheck() {
@@ -491,8 +514,6 @@ void pregcprocessing() {
 #if defined(GC_CACHE_ADAPT)&&defined(GC_CACHE_SAMPLING)
   // disable the timer interrupt
   bamboo_mask_timer_intr();
-#endif
-#if defined(GC_CACHE_ADAPT)&&defined(GC_CACHE_SAMPLING)
   // get the sampling data 
   bamboo_output_dtlb_sampling();
 #endif
@@ -503,6 +524,8 @@ void postgcprocessing() {
   // enable the timer interrupt
   bamboo_tile_timer_set_next_event(GC_TILE_TIMER_EVENT_SETTING); 
   bamboo_unmask_timer_intr();
+  //turn on sampling again
+  bamboo_dtlb_sampling_init();
 #endif
 }
 
@@ -512,6 +535,9 @@ bool gc(struct garbagelist * stackptr) {
     gc_status_info.gcprocessing = false;
     return false;
   }
+#ifdef PERFCOUNT
+  profile_start(GC_REGION);
+#endif
 
   // core coordinator routine
   if(0 == BAMBOO_NUM_OF_CORE) {
@@ -536,6 +562,9 @@ bool gc(struct garbagelist * stackptr) {
     gc_nocollect(stackptr);
   }
   postgcprocessing();
+#ifdef PERFCOUNT
+  profile_start(APP_REGION);
+#endif
   return true;
 }