24 #include "RConfigure.h"
27 typedef void (*FreeHookFun_t)(
void*,
void *addr, size_t);
28 typedef void *(*ReAllocFun_t)(
void*, size_t);
29 typedef void *(*ReAllocCFun_t)(
void*, size_t, size_t);
30 typedef char *(*ReAllocCharFun_t)(
char*, size_t, size_t);
36 static size_t fgMaxBlockSize;
37 static FreeHookFun_t fgFreeHook;
38 static void *fgFreeHookData;
39 static ReAllocFun_t fgReAllocHook;
40 static ReAllocCFun_t fgReAllocCHook;
41 static Bool_t fgHasCustomNewDelete;
45 kIsOnHeap = 0x01000000,
49 static const UInt_t kObjectAllocMemValue = 0x99999999;
53 virtual ~TStorage() { }
55 static ULong_t GetHeapBegin();
56 static ULong_t GetHeapEnd();
57 static FreeHookFun_t GetFreeHook();
58 static void *GetFreeHookData();
59 static size_t GetMaxBlockSize();
60 static void *Alloc(
size_t size);
61 static void Dealloc(
void *ptr);
62 static void *ReAlloc(
void *vp,
size_t size);
63 static void *ReAlloc(
void *vp,
size_t size,
size_t oldsize);
64 static char *ReAllocChar(
char *vp,
size_t size,
size_t oldsize);
65 static Int_t *ReAllocInt(Int_t *vp,
size_t size,
size_t oldsize);
66 static void *ObjectAlloc(
size_t size);
67 static void *ObjectAllocArray(
size_t size);
68 static void *ObjectAlloc(
size_t size,
void *vp);
69 static void ObjectDealloc(
void *vp);
71 static void ObjectDealloc(
void *vp,
size_t size);
73 static void ObjectDealloc(
void *vp,
void *ptr);
75 static void EnterStat(
size_t size,
void *p);
76 static void RemoveStat(
void *p);
77 static void PrintStatistics();
78 static void SetMaxBlockSize(
size_t size);
79 static void SetFreeHook(FreeHookFun_t func,
void *data);
80 static void SetReAllocHooks(ReAllocFun_t func1, ReAllocCFun_t func2);
81 static void SetCustomNewDelete();
82 static void EnableStatistics(
int size= -1,
int ix= -1);
84 static Bool_t HasCustomNewDelete();
87 static void AddToHeap(ULong_t begin, ULong_t end);
88 static Bool_t IsOnHeap(
void *p);
90 static Bool_t FilledByObjectAlloc(
volatile const UInt_t*
const member);
91 static void UpdateIsOnHeap(
volatile const UInt_t &uniqueID,
volatile UInt_t &bits);
96 inline Bool_t TStorage::FilledByObjectAlloc(
volatile const UInt_t *
const member) {
118 R__INTENTIONALLY_UNINIT_BEGIN
119 return *member == kObjectAllocMemValue;
120 R__INTENTIONALLY_UNINIT_END
131 R__NEVER_INLINE
void TStorage::UpdateIsOnHeap(
volatile const UInt_t &uniqueID,
volatile UInt_t &bits) {
132 if (TStorage::FilledByObjectAlloc(&uniqueID))
139 inline size_t TStorage::GetMaxBlockSize() {
return fgMaxBlockSize; }
141 inline void TStorage::SetMaxBlockSize(
size_t size) { fgMaxBlockSize = size; }
143 inline FreeHookFun_t TStorage::GetFreeHook() {
return fgFreeHook; }
147 using FreeIfTMapFile_t = bool(
void*);
148 R__EXTERN FreeIfTMapFile_t *gFreeIfTMapFile;
149 R__EXTERN
void *gMmallocDesc;