#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;
}
#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;
#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);
WAITFORGCPHASE(MARKPHASE);
GC_PRINTF("Start mark phase\n");
+ GCPROFILE_ITEM();
+
mark(stackptr);
GC_PRINTF("Finish mark phase, start compact phase\n");
compact();
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");
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);
}
void gc_master(struct garbagelist * stackptr) {
- //tprintf("start GC!\n");
+ tprintf("start GC!\n");
gc_status_info.gcprocessing = true;
gc_status_info.gcphase = INITPHASE;
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);
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() {
#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
// 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
}
gc_status_info.gcprocessing = false;
return false;
}
+#ifdef PERFCOUNT
+ profile_start(GC_REGION);
+#endif
// core coordinator routine
if(0 == BAMBOO_NUM_OF_CORE) {
gc_nocollect(stackptr);
}
postgcprocessing();
+#ifdef PERFCOUNT
+ profile_start(APP_REGION);
+#endif
return true;
}