Go to the documentation of this file.00001 #ifndef IG_HOOK_IG_HOOK_TRACE_H
00002 # define IG_HOOK_IG_HOOK_TRACE_H
00003
00004
00005
00006 # include <new>
00007
00008
00009
00010
00011
00012
00013
00014
00015 class IgHookTraceAlloc
00016 {
00017 public:
00018 IgHookTraceAlloc (void);
00019
00020 void * allocate (size_t bytes);
00021
00022 private:
00023 void * m_pool;
00024 size_t m_left;
00025 };
00026
00027 class IgHookTrace
00028 {
00029 public:
00031 struct Counter { const char *m_name; };
00032
00034 class CounterValue
00035 {
00036 public:
00037 void * operator new (size_t n, IgHookTraceAlloc *alloc = 0);
00038
00039 CounterValue (Counter *counter,
00040 CounterValue *next = 0,
00041 unsigned long long value = 0);
00042
00043
00044
00045
00046 Counter * counter (void);
00047 CounterValue * next (void);
00048 unsigned long long count (void);
00049
00050 unsigned long long value (void);
00051 unsigned long long tick (void);
00052 unsigned long long untick (void);
00053 unsigned long long add (unsigned long long value);
00054 unsigned long long add (CounterValue &x);
00055 unsigned long long sub (unsigned long long value);
00056 unsigned long long sub (CounterValue &x);
00057 unsigned long long max (unsigned long long value);
00058 unsigned long long max (CounterValue &x);
00059
00060 private:
00061 Counter *m_counter;
00062 CounterValue *m_next;
00063 unsigned long long m_value;
00064 unsigned long long m_count;
00065 };
00066
00067
00068 static int stacktrace (void **addresses, int nmax);
00069 static void * tosymbol (void *address);
00070 static bool symbol (void *address, const char *&sym,
00071 const char *&lib, int &offset,
00072 int &liboffset);
00073
00074 void * operator new (size_t n, IgHookTraceAlloc *alloc = 0);
00075
00076
00077 IgHookTrace (IgHookTrace *parent = 0, void *address = 0);
00078
00079 IgHookTrace * parent (void);
00080 IgHookTrace * next (void);
00081
00082 void * address (void);
00083 bool symbol (const char *&sym, const char *&lib,
00084 int &offset, int &liboffset);
00085
00086 IgHookTrace * children (void);
00087 IgHookTrace * child (void *address);
00088
00089 CounterValue * counters (void);
00090 CounterValue * counter (Counter *id);
00091
00092 void merge (IgHookTrace *other);
00093
00094 private:
00095 IgHookTraceAlloc *m_alloc;
00096 IgHookTrace *m_parent;
00097 IgHookTrace *m_next;
00098 IgHookTrace *m_children;
00099 void *m_address;
00100 CounterValue *m_counters;
00101 };
00102
00103
00104
00105
00106 #endif // IG_HOOK_IG_HOOK_TRACE_H