00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOT_TMemStatManager
00013 #define ROOT_TMemStatManager
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <map>
00023 #include <vector>
00024 #include <memory>
00025 #include <cstdlib>
00026
00027 #ifndef ROOT_TObject
00028 #include "TObject.h"
00029 #endif
00030 #ifndef ROOT_TTimeStamp
00031 #include "TTimeStamp.h"
00032 #endif
00033
00034 #ifndef ROOT_TMemStatDepend
00035 #include "TMemStatDepend.h"
00036 #endif
00037 #ifndef ROOT_TmemStatInfo
00038 #include "TMemStatInfo.h"
00039 #endif
00040
00041
00042 class TTree;
00043 class TMemStatStackInfo;
00044
00045 typedef std::vector<Int_t> IntVector_t;
00046 typedef std::auto_ptr<TFile> TFilePtr_t;
00047
00048 class TMemStatManager: public TObject
00049 {
00050 struct TMemInfo_t {
00051 void *fAddress;
00052 size_t fSize;
00053 Int_t fStackIndex;
00054 };
00055
00056 struct TMemTable_t {
00057 Int_t fAllocCount;
00058 Int_t fMemSize;
00059 Int_t fTableSize;
00060 Int_t fFirstFreeSpot;
00061 TMemInfo_t *fLeaks;
00062 };
00063
00064 struct TDeleteTable_t {
00065 Int_t fAllocCount;
00066 Int_t fTableSize;
00067 TMemInfo_t *fLeaks;
00068 };
00069
00070 public:
00071 typedef std::vector<TMemStatCodeInfo> CodeInfoContainer_t;
00072
00073 enum EStatusBits {
00074 kUserDisable = BIT(18),
00075 kStatDisable = BIT(16),
00076 kStatRoutine = BIT(17)
00077 };
00078 enum EDumpTo { kTree, kSysTree };
00079
00080 TMemStatManager();
00081 virtual ~TMemStatManager();
00082
00083 void Enable();
00084 void Disable();
00085 void SetAutoStamp(UInt_t sizeMem, UInt_t n, UInt_t max) {
00086 fAutoStampSize = sizeMem;
00087 fAutoStampN = n;
00088 fAutoStampDumpSize = max;
00089 }
00090 void AddStamps(const char * stampname = 0);
00091 static void SAddStamps(const Char_t * stampname);
00092
00093 static TMemStatManager* GetInstance();
00094 static void Close();
00095 TMemStatInfoStamp &AddStamp();
00096 TMemStatCodeInfo &GetCodeInfo(void *address);
00097 UInt_t GetCodeInfoIndex(void *address) {
00098 return fCodeInfoMap[address];
00099 }
00100 void DumpTo(EDumpTo _DumpTo, Bool_t _clearStamps = kTRUE, const char * _stampName = 0);
00101
00102 public:
00103 typedef void (*StampCallback_t)(const Char_t * desription);
00104
00105 IntVector_t fSTHashTable;
00106 Int_t fCount;
00107 Int_t fStampNumber;
00108 std::vector<TMemStatStackInfo> fStackVector;
00109 std::vector<TMemStatInfoStamp> fStampVector;
00110 std::vector<TTimeStamp> fStampTime;
00111 CodeInfoContainer_t fCodeInfoArray;
00112 std::map<const void*, UInt_t> fCodeInfoMap;
00113 Int_t fDebugLevel;
00114 TMemStatManager::StampCallback_t fStampCallBack;
00115 void SetUseGNUBuildinBacktrace(Bool_t _NewVal) {
00116 fUseGNUBuildinBacktrace = _NewVal;
00117 }
00118
00119 protected:
00120 TMemStatDepend::MallocHookFunc_t fPreviousMallocHook;
00121 TMemStatDepend::FreeHookFunc_t fPreviousFreeHook;
00122 void Init();
00123 TMemStatStackInfo *STAddInfo(Int_t size, void **stackptrs);
00124 TMemStatStackInfo *STFindInfo(Int_t size, void **stackptrs);
00125 void RehashLeak(Int_t newSize);
00126 void *AddPointer(size_t size, void *ptr = 0);
00127 void FreePointer(void *p);
00128 static void *AllocHook(size_t size, const void* );
00129 static void FreeHook(void* ptr, const void* );
00130 TMemStatInfoStamp fLastStamp;
00131 TMemStatInfoStamp fCurrentStamp;
00132 UInt_t fAutoStampSize;
00133 UInt_t fAutoStampN;
00134 UInt_t fAutoStampDumpSize;
00135 Int_t fMinStampSize;
00136
00137 Int_t fSize;
00138 TMemTable_t **fLeak;
00139 Int_t fAllocCount;
00140 TDeleteTable_t fMultDeleteTable;
00141 TFilePtr_t fDumpFile;
00142 TTree *fDumpTree;
00143 TTree *fDumpSysTree;
00144 static TMemStatManager *fgInstance;
00145 static void *fgStackTop;
00146
00147 void FreeHashtable() {
00148 if (!fLeak)
00149 return;
00150
00151 for (Int_t i = 0; i < fSize; ++i)
00152 free(fLeak[i]);
00153 free(fLeak);
00154 }
00155
00156 Bool_t fUseGNUBuildinBacktrace;
00157
00158 ClassDef(TMemStatManager, 1)
00159 };
00160
00161 #endif