00001
00002
00003 #ifndef _CORE_COMMON_PROFILER_HPP
00004 #define _CORE_COMMON_PROFILER_HPP
00005
00006 void *memset(void *buffer, int c, uint32 num);
00007 namespace Arch {
00008 namespace x86 {
00009 namespace RTC {
00010 extern uint64 volatile up_time; }}}
00011
00012
00014 namespace Debug {
00015 namespace Profiler {
00016
00018 inline uint64 rdtsc()
00019 {
00020 union
00021 {
00022 uint32 u32[2];
00023 uint64 u64;
00024 };
00025 asm volatile ("rdtsc" :"=a" (u32[0]), "=d"(u32[1]));
00026 return u64;
00027 }
00028
00029
00030
00031
00032
00033 struct profiling_s
00034 {
00035 uint64 volatile Time;
00036 uint32 volatile Calls;
00037 uint32 volatile Active;
00038 char *Name;
00039 };
00040
00041
00042 #define MAX_PROFILER 200
00043
00044 extern uint32 ProfilerCount;
00045 extern struct profiling_s ProfilerBuf[MAX_PROFILER];
00046
00047 #define PROFILER_ENABLE
00048 #ifdef PROFILER_ENABLE
00049
00050 #define _Pf(n) static uint32 __Zx3Ed8_ = 0xffff; \
00051 uint64 __ZxCOMPS; \
00052 do { \
00053 if (__Zx3Ed8_ == 0xffff) { __Zx3Ed8_= Debug::Profiler::ProfilerCount++; \
00054 if (Debug::Profiler::ProfilerCount >= MAX_PROFILER) \
00055 {cout((char*)n); \
00056 sysfail("profiler: buffer too small!"); }\
00057 memset(&Debug::Profiler::ProfilerBuf[__Zx3Ed8_],0,sizeof(Debug::Profiler::profiling_s)); \
00058 Debug::Profiler::ProfilerBuf[__Zx3Ed8_].Name=(char*)n; } \
00059 __ZxCOMPS=Debug::Profiler::rdtsc(); \
00060 Debug::Profiler::ProfilerBuf[__Zx3Ed8_].Active++; \
00061 \
00062 } while(0)
00063
00064
00065 #define _PF _Pf(__func__)
00066
00067
00068 #define _PFEnd do { \
00069 Debug::Profiler::ProfilerBuf[__Zx3Ed8_].Time+=Debug::Profiler::rdtsc()-__ZxCOMPS;\
00070 Debug::Profiler::ProfilerBuf[__Zx3Ed8_].Active--; \
00071 Debug::Profiler::ProfilerBuf[__Zx3Ed8_].Calls++;\
00072 } while (0)
00073
00074
00075 #define Preturn(r) do { _PFEnd; return r; } while(0)
00076 #define preturn(r) do { _PFEnd; return r; } while(0)
00077
00078 void stats(bool SortBySlowest);
00079 int ProfilingCompar(const void*,const void*);
00080 #endif
00081
00082 #ifndef PROFILER_ENABLE
00083 #define _PF do { } while(0)
00084 #define _Pf(n) do { } while (0)
00085 #define _PFEnd do { } while (0)
00086 #define Preturn(r) do { return r; } while(0)
00087 #define preturn(r) do { return r; } while(0)
00088 inline void stats(bool SortBySlowest) { }
00089 #endif
00090
00091
00092 };
00093 };
00094
00097 inline uint64 rdtsc()
00098 {
00099 return Debug::Profiler::rdtsc();
00100 }
00101
00102 #endif