Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_IVARIA_PROFILE_H__
00020 #define __CS_IVARIA_PROFILE_H__
00021
00026 #include "csutil/array.h"
00027 #include "csutil/scf_interface.h"
00028 #include "csutil/sysfunc.h"
00029 #include "csutil/threading/atomicops.h"
00030
00031 struct iObjectRegistry;
00032
00033
00034
00035 namespace CS
00036 {
00037 namespace Debug
00038 {
00039 class ProfileZone
00040 {
00041 public:
00042
00043 ProfileZone ()
00044 : zoneName (0), parentZone (0), totalTime (0), enterCount (0)
00045 {}
00046
00047 ~ProfileZone ()
00048 {
00049 delete[] zoneName;
00050 }
00051
00052
00053 const char* zoneName;
00054 ProfileZone* parentZone;
00055 uint64 totalTime;
00056 uint32 enterCount;
00057 };
00058
00059
00060 class ProfileCounter
00061 {
00062 public:
00063
00064
00065 ProfileCounter ()
00066 : counterName (0), counterValue (0)
00067 {
00068 }
00069
00070 ~ProfileCounter ()
00071 {
00072 delete[] counterName;
00073 }
00074
00075
00076 const char* counterName;
00077 uint64 counterValue;
00078 };
00079
00080 class ProfilerZoneScope
00081 {
00082 public:
00083 ProfilerZoneScope (ProfileZone* zone)
00084 {
00085 this->zone = zone;
00086 startTime = csGetMicroTicks ();
00087 }
00088
00089 ~ProfilerZoneScope ()
00090 {
00091 int64 stopTime = csGetMicroTicks ();
00092
00093 zone->enterCount++;
00094 zone->totalTime += (stopTime - startTime);
00095 }
00096
00097
00098 private:
00099 int64 startTime;
00100 ProfileZone* zone;
00101 };
00102
00103 inline void ProfilerCounterAdd (ProfileCounter* counter)
00104 {
00105 counter->counterValue++;
00106 }
00107 }
00108 }
00109
00110
00114 struct iProfiler : public virtual iBase
00115 {
00116 SCF_INTERFACE (iProfiler, 3,0,1);
00117
00123 CS_DEPRECATED_METHOD_MSG("Old profiling discontinued; check docs for new API")
00124 static void RegisterProfilePoint (const char*, const char*, int, uint32*,
00125 uint32*, uint32*, uint32*) {}
00126 CS_DEPRECATED_METHOD_MSG("Old profiling discontinued; check docs for new API")
00127 static void Dump () {}
00135 virtual CS::Debug::ProfileZone* GetProfileZone (const char* zonename) = 0;
00136
00142 virtual CS::Debug::ProfileCounter* GetProfileCounter (const char* countername) = 0;
00143
00147 virtual void Reset () = 0;
00148
00152 virtual const csArray<CS::Debug::ProfileZone*>& GetProfileZones () = 0;
00153
00157 virtual const csArray<CS::Debug::ProfileCounter*>& GetProfileCounters () = 0;
00158
00167 virtual void StartLogging (const char* filenamebase,
00168 iObjectRegistry* objreg) = 0;
00169
00173 virtual void StopLogging () = 0;
00174 };
00175
00179 struct iProfilerFactory : public virtual iBase
00180 {
00181 SCF_INTERFACE (iProfilerFactory, 1,0,0);
00182
00186 virtual iProfiler* GetProfiler () = 0;
00187 };
00188
00189 #ifdef CS_USE_PROFILER
00190 #define CS_DECLARE_PROFILER \
00191 static iProfiler* CS_DEBUG_Profiler_staticProfilerPtr = 0; \
00192 static inline iProfiler* CS_DEBUG_Profiler_GetProfiler () \
00193 { \
00194 if (!CS_DEBUG_Profiler_staticProfilerPtr) \
00195 { \
00196 csRef<iProfilerFactory> fact = \
00197 scfCreateInstance<iProfilerFactory> ("crystalspace.utilities.profiler"); \
00198 CS_DEBUG_Profiler_staticProfilerPtr = fact->GetProfiler (); \
00199 } \
00200 CS_ASSERT (CS_DEBUG_Profiler_staticProfilerPtr); \
00201 return CS_DEBUG_Profiler_staticProfilerPtr; \
00202 }
00203 #define CS_DECLARE_PROFILER_ZONE(name) \
00204 static CS::Debug::ProfileZone* CS_DEBUG_Profiler_staticProfileZone ## name = 0; \
00205 static inline CS::Debug::ProfileZone* CS_DEBUG_Profiler_GetProfileZone ## name () \
00206 {\
00207 if (!CS_DEBUG_Profiler_staticProfileZone ## name) \
00208 {\
00209 CS_DEBUG_Profiler_staticProfileZone ## name = CS_DEBUG_Profiler_GetProfiler ()->GetProfileZone (#name); \
00210 }\
00211 return CS_DEBUG_Profiler_staticProfileZone ## name; \
00212 }
00213 #define CS_DECLARE_PROFILER_COUNTER(name) \
00214 static CS::Debug::ProfileCounter* CS_DEBUG_Profiler_staticProfileCounter ## name = 0; \
00215 static inline CS::Debug::ProfileCounter* CS_DEBUG_Profiler_GetProfileCounter ## name () \
00216 {\
00217 if (!CS_DEBUG_Profiler_staticProfileCounter ## name) \
00218 {\
00219 CS_DEBUG_Profiler_staticProfileCounter ## name = CS_DEBUG_Profiler_GetProfiler ()->GetProfileZone (#name); \
00220 }\
00221 return CS_DEBUG_Profiler_staticProfileCounter ## name; \
00222 }
00223 #define CS_PROFILER_GET_PROFILER \
00224 CS_DEBUG_Profiler_GetProfiler ()
00225 #define CS_PROFILER_ZONE(name) \
00226 CS::Debug::ProfilerZoneScope CS_DEBUG_Profiler_zone ## name ## __LINE__ \
00227 (CS_DEBUG_Profiler_GetProfileZone ## name());
00228 #define CS_PROFILER_COUNTER(name) \
00229 CS::Debug::ProfilerCounterAdd (CS_DEBUG_Profiler_GetProfileCounter ## name());
00230 #define CS_PROFILER_START_LOGGING(filebase, objectreg) \
00231 CS_DEBUG_Profiler_GetProfiler ()->StartLogging (filebase, objectreg);
00232 #define CS_PROFILER_STOP_LOGGING() \
00233 CS_DEBUG_Profiler_GetProfiler ()->StopLogging ();
00234 #define CS_PROFILER_RESET() \
00235 CS_DEBUG_Profiler_GetProfiler ()->Reset ();
00236 #else
00237
00238 #define CS_DECLARE_PROFILER
00239 #define CS_DECLARE_PROFILER_ZONE(name)
00240 #define CS_DECLARE_PROFILER_COUNTER(name)
00241 #define CS_PROFILER_GET_PROFILER (0)
00242 #define CS_PROFILER_ZONE(name)
00243 #define CS_PROFILER_COUNTER(name)
00244 #define CS_PROFILER_START_LOGGING(filebase, objectreg)
00245 #define CS_PROFILER_STOP_LOGGING()
00246 #define CS_PROFILER_RESET()
00247 #endif
00248
00249
00250 #endif