Add gcprofile to PMC garbage collector and compute the size of allocated obj instead...
[IRC.git] / Robust / src / Runtime / bamboo / multicoregcprofile.h
index 9ddbf86aaa83a82c227646a23153a165326cd95b..899c7b70f8ffa7900969ed201c5c19e8a157e50e 100644 (file)
@@ -10,6 +10,8 @@
 
 #ifdef GC_CACHE_ADAPT
 #define GC_PROFILE_NUM_FIELD 15
+#elif defined PMC_GC
+#define GC_PROFILE_NUM_FIELD 15
 #else
 #define GC_PROFILE_NUM_FIELD 14
 #endif // GC_CACHE_ADAPT
@@ -19,18 +21,22 @@ typedef struct gc_info {
   unsigned int index;
 } GCInfo;
 
+// the following data are supposed to be only valid on the master core
+// the other cores should not maintain them
 GCInfo * gc_infoArray[GCINFOLENGTH];
 unsigned int gc_infoIndex;
 bool gc_infoOverflow;
+unsigned int gc_num_profiles;
+unsigned int gc_size_allocatedobj;
 unsigned long long gc_num_livespace;
 unsigned long long gc_num_freespace;
 unsigned long long gc_num_lobjspace;
 unsigned int gc_num_lobj;
 
+// these data should be maintained by all gc cores
 unsigned int gc_num_liveobj;
-unsigned int gc_num_obj;
 unsigned int gc_num_forwardobj;
-unsigned int gc_num_profiles;
+
 
 #ifdef MGC_SPEC
 volatile bool gc_profile_flag;
@@ -50,7 +56,8 @@ INLINE static void gc_profileInit() {
   gc_num_profiles = NUMCORESACTIVE - 1;
 }
 
-INLINE static void gc_profileStart(void) {
+// these *_master function can only be invoked by the master core
+INLINE static void gc_profileStart_master(void) {
   if(!gc_infoOverflow) {
     GCInfo* gcInfo = RUNMALLOC(sizeof(struct gc_info));
     gc_infoArray[gc_infoIndex] = gcInfo;
@@ -59,14 +66,14 @@ INLINE static void gc_profileStart(void) {
   }
 }
 
-INLINE static void gc_profileItem(void) {
+INLINE static void gc_profileItem_master(void) {
   if(!gc_infoOverflow) {
     GCInfo* gcInfo = gc_infoArray[gc_infoIndex];
     gcInfo->time[gcInfo->index++] = BAMBOO_GET_EXE_TIME();
   }
 }
 
-INLINE static void gc_profileEnd(void) {
+INLINE static void gc_profileEnd_master(void) {
   if(!gc_infoOverflow) {
     GCInfo* gcInfo = gc_infoArray[gc_infoIndex];
     gcInfo->time[gcInfo->index++] = BAMBOO_GET_EXE_TIME();
@@ -74,10 +81,11 @@ INLINE static void gc_profileEnd(void) {
     gcInfo->time[gcInfo->index++] = gc_num_freespace;
     gcInfo->time[gcInfo->index++] = gc_num_lobj;
     gcInfo->time[gcInfo->index++] = gc_num_lobjspace;
-    gcInfo->time[gcInfo->index++] = gc_num_obj;
+    gcInfo->time[gcInfo->index++] = gc_size_allocatedobj;
     gcInfo->time[gcInfo->index++] = gc_num_liveobj;
     gcInfo->time[gcInfo->index++] = gc_num_forwardobj;
     gc_infoIndex++;
+    gc_size_allocatedobj = 0; // reset the counter of allocated obj
     if(gc_infoIndex == GCINFOLENGTH) {
       gc_infoOverflow = true;
     }
@@ -90,12 +98,18 @@ INLINE static void gc_profileEnd(void) {
 #define GCPROFILE_INFO_2_MASTER() \
   { \
     if(STARTUPCORE != BAMBOO_NUM_OF_CORE) { \
-      send_msg_4(STARTUPCORE,GCPROFILES,gc_num_obj,gc_num_liveobj,gc_num_forwardobj); \
+      send_msg_3(STARTUPCORE,GCPROFILES,gc_num_liveobj,gc_num_forwardobj); \
     }\
-    gc_num_obj = 0; \
   }
 
 #ifdef MGC_SPEC
+// record allocated obj info
+#define GCPROFILE_RECORD_ALLOCATED_OBJ(size) \
+  { \
+    if(gc_profile_flag) {\
+      gc_size_allocatedobj += size; \
+    } \
+  }
 // record lobj info
 #define GCPROFILE_RECORD_LOBJ() \
   { \
@@ -108,8 +122,23 @@ INLINE static void gc_profileEnd(void) {
       gc_num_lobjspace = sumsize; \
     } \
   }
+#ifdef PMC_GC
+// check the live/free space info
+#define GCPROFILE_RECORD_SPACE_MASTER() \
+  { \
+    if(gc_profile_flag) { \
+      gc_num_freespace = 0; \
+      for(int i=0;i<NUMCORES4GC;i+=2) { \
+        void *startptr=pmc_heapptr->regions[i].lastptr; \
+        void *finishptr=(i+1)<NUMCORES4GC?pmc_heapptr->regions[i+1].lastptr:pmc_heapptr->regions[i].endptr; \
+        gc_num_freespace += finishptr-startptr; \ 
+      } \
+      gc_num_livespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_freespace; \
+    } \
+  }
+#else
 // check the live/free space info
-#define GCPROFILE_RECORD_SPACE() \
+#define GCPROFILE_RECORD_SPACE_MASTER() \
   { \
     if(gc_profile_flag) { \
       gc_num_freespace = 0; \
@@ -123,6 +152,7 @@ INLINE static void gc_profileEnd(void) {
       gc_num_livespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_freespace; \
     } \
   }
+#endif
 // record forward obj info
 #define GCPROFILE_RECORD_FORWARD_OBJ() \
   { \
@@ -133,45 +163,69 @@ INLINE static void gc_profileEnd(void) {
   { \
       gc_num_liveobj++; \
   }
-#define GCPROFILE_START() \
+#define GCPROFILE_START_MASTER() \
   { \
     if(gc_profile_flag) { \
-      gc_profileStart(); \
+      gc_profileStart_master(); \
     } \
   }
-#define GCPROFILE_ITEM() \
+#define GCPROFILE_ITEM_MASTER() \
   { \
     if(gc_profile_flag) { \
-      gc_profileItem(); \
+      gc_profileItem_master(); \
     } \
   }
-#define GCPROFILE_END() \
+#define GCPROFILE_END_MASTER() \
   { \
     if(gc_profile_flag) { \
-      gc_profileEnd(); \
+      gc_profileEnd_master(); \
     } \
   }
 #else // MGC_SPEC
+// record allocated obj info
+#define GCPROFILE_RECORD_ALLOCATED_OBJ(size) \
+  { \
+    gc_size_allocatedobj += size; \
+  }
 #define GCPROFILE_RECORD_LOBJ() (gc_num_lobj++)
 #define GCPROFILE_RECORD_LOBJSPACE() (gc_num_lobjspace = sumsize)
-#define GCPROFILE_RECORD_SPACE() \
+#ifdef PMC_GC
+// check the live/free space info
+#define GCPROFILE_RECORD_SPACE_MASTER() \
   { \
-    gc_num_livespace = 0; \
-    for(int tmpi = 0; tmpi < GCNUMBLOCK; tmpi++) { \
-      gc_num_livespace += bamboo_smemtbl[tmpi]; \
+    gc_num_freespace = 0; \
+    for(int i=0;i<NUMCORES4GC;i+=2) { \
+      void *startptr=pmc_heapptr->regions[i].lastptr; \
+      void *finishptr=(i+1)<NUMCORES4GC?pmc_heapptr->regions[i+1].lastptr:pmc_heapptr->regions[i].endptr; \
+      gc_num_freespace += finishptr-startptr; \ 
     } \
-    gc_num_freespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_livespace; \
+    gc_num_livespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_freespace; \
   }
+#else
+#define GCPROFILE_RECORD_SPACE_MASTER() \
+  { \
+    gc_num_freespace = 0; \
+    block_t lowestblock=allocationinfo.lowestfreeblock; \
+    for(block_t searchblock=lowestblock;searchblock<GCNUMBLOCK;searchblock++) { \
+      struct blockrecord * block=&allocationinfo.blocktable[searchblock]; \
+      if (block->status==BS_FREE) { \
+        gc_num_freespace+=block->freespace&~BAMBOO_CACHE_LINE_MASK; \
+      } \
+    } \
+    gc_num_livespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_freespace; \
+  }
+#endif
 #define GCPROFILE_RECORD_FORWARD_OBJ() (gc_num_forwardobj++)
 #define GCPROFILE_RECORD_LIVE_OBJ() (gc_num_liveobj++)
-#define GCPROFILE_START() gc_profileStart()
-#define GCPROFILE_ITEM() gc_profileItem()
-#define GCPROFILE_END() gc_profileEnd()
+#define GCPROFILE_START_MASTER() gc_profileStart_master()
+#define GCPROFILE_ITEM_MASTER() gc_profileItem_master()
+#define GCPROFILE_END_MASTER() gc_profileEnd_master()
 #endif // MGC_SPEC
 
 #define GCPROFILE_INIT() gc_profileInit()
 
 #else // GC_PROFILE
+#define GCPROFILE_RECORD_ALLOCATED_OBJ(size) 
 #define INIT_MULTICORE_GCPROFILE_DATA()
 #define GC_OUTPUT_PROFILE_DATA() 
 #define GCPROFILE_INFO_2_MASTER() 
@@ -180,9 +234,9 @@ INLINE static void gc_profileEnd(void) {
 #define GCPROFILE_RECORD_SPACE()
 #define GCPROFILE_RECORD_FORWARD_OBJ() 
 #define GCPROFILE_RECORD_LIVE_OBJ() 
-#define GCPROFILE_START()
-#define GCPROFILE_ITEM()
-#define GCPROFILE_END()
+#define GCPROFILE_START_MASTER()
+#define GCPROFILE_ITEM_MASTER()
+#define GCPROFILE_END_MASTER()
 #define GCPROFILE_INIT()
 #endif // GC_PROFILE