#ifndef BAMBOO_MULTICORE_GC_PROFILE_H
#define BAMBOO_MULTICORE_GC_PROFILE_H
-#ifdef MULTICORE_GC
+#if defined(MULTICORE_GC)||defined(PMC_GC)
#include "multicore.h"
+#include "runtime_arch.h"
+#include "structdefs.h"
#ifdef GC_PROFILE
#define GCINFOLENGTH 100
volatile bool gc_profile_flag;
#endif
-
-INLINE void initmulticoregcprofiledata(void);
-INLINE void gc_profileInit(void);
-INLINE void gc_profileStart(void);
-INLINE void gc_profileItem(void);
-INLINE void gc_profileEnd(void);
+void initmulticoregcprofiledata(void);
void gc_outputProfileData();
+void gc_outputProfileDataReadable();
+
+INLINE static void gc_profileInit() {
+ gc_num_livespace = 0;
+ gc_num_freespace = 0;
+ gc_num_lobj = 0;
+ gc_num_lobjspace = 0;
+ gc_num_liveobj = 0;
+ gc_num_forwardobj = 0;
+ gc_num_profiles = NUMCORESACTIVE - 1;
+}
+
+INLINE static void gc_profileStart(void) {
+ if(!gc_infoOverflow) {
+ GCInfo* gcInfo = RUNMALLOC(sizeof(struct gc_info));
+ gc_infoArray[gc_infoIndex] = gcInfo;
+ gcInfo->index = 1;
+ gcInfo->time[0] = BAMBOO_GET_EXE_TIME();
+ }
+}
+
+INLINE static void gc_profileItem(void) {
+ if(!gc_infoOverflow) {
+ GCInfo* gcInfo = gc_infoArray[gc_infoIndex];
+ gcInfo->time[gcInfo->index++] = BAMBOO_GET_EXE_TIME();
+ }
+}
+
+INLINE static void gc_profileEnd(void) {
+ if(!gc_infoOverflow) {
+ GCInfo* gcInfo = gc_infoArray[gc_infoIndex];
+ gcInfo->time[gcInfo->index++] = BAMBOO_GET_EXE_TIME();
+ gcInfo->time[gcInfo->index++] = gc_num_livespace;
+ 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_num_liveobj;
+ gcInfo->time[gcInfo->index++] = gc_num_forwardobj;
+ gc_infoIndex++;
+ if(gc_infoIndex == GCINFOLENGTH) {
+ gc_infoOverflow = true;
+ }
+ }
+}
#define INIT_MULTICORE_GCPROFILE_DATA() initmulticoregcprofiledata()
#define GC_OUTPUT_PROFILE_DATA() gc_outputProfileData()
#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, false); \
+ send_msg_4(STARTUPCORE,GCPROFILES,gc_num_obj,gc_num_liveobj,gc_num_forwardobj); \
}\
gc_num_obj = 0; \
}
// record lobj info
#define GCPROFILE_RECORD_LOBJ() \
{ \
- if(gc_profile_flag) { \
gc_num_lobj++; \
- } \
}
// record lobj space info
#define GCPROFILE_RECORD_LOBJSPACE() \
#define GCPROFILE_RECORD_SPACE() \
{ \
if(gc_profile_flag) { \
- gc_num_livespace = 0; \
- for(int tmpi = 0; tmpi < gcnumblock; tmpi++) { \
- gc_num_livespace += bamboo_smemtbl[tmpi]; \
+ 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_freespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_livespace; \
+ gc_num_livespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_freespace; \
} \
}
// record forward obj info
#define GCPROFILE_RECORD_FORWARD_OBJ() \
{ \
- if(gc_profile_flag) { \
gc_num_forwardobj++; \
- } \
}
// record live obj info
#define GCPROFILE_RECORD_LIVE_OBJ() \
{ \
- if(gc_profile_flag) { \
gc_num_liveobj++; \
- } \
}
#define GCPROFILE_START() \
{ \
gc_profileItem(); \
} \
}
+#define GCPROFILE_END() \
+ { \
+ if(gc_profile_flag) { \
+ gc_profileEnd(); \
+ } \
+ }
#else // MGC_SPEC
#define GCPROFILE_RECORD_LOBJ() (gc_num_lobj++)
#define GCPROFILE_RECORD_LOBJSPACE() (gc_num_lobjspace = sumsize)
#define GCPROFILE_RECORD_SPACE() \
{ \
gc_num_livespace = 0; \
- for(int tmpi = 0; tmpi < gcnumblock; tmpi++) { \
+ for(int tmpi = 0; tmpi < GCNUMBLOCK; tmpi++) { \
gc_num_livespace += bamboo_smemtbl[tmpi]; \
} \
gc_num_freespace = (BAMBOO_SHARED_MEM_SIZE) - gc_num_livespace; \
#define GCPROFILE_RECORD_LIVE_OBJ() (gc_num_liveobj++)
#define GCPROFILE_START() gc_profileStart()
#define GCPROFILE_ITEM() gc_profileItem()
+#define GCPROFILE_END() gc_profileEnd()
#endif // MGC_SPEC
-#define GCPROFILE_END() gc_profileEnd()
#define GCPROFILE_INIT() gc_profileInit()
#else // GC_PROFILE