00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #ifndef _MALLOC_HOOK_H
00045 #define _MALLOC_HOOK_H
00046
00047 #include <stddef.h>
00048 #include <sys/types.h>
00049
00050
00051 #ifndef PERFTOOLS_DLL_DECL
00052 # ifdef WIN32
00053 # define PERFTOOLS_DLL_DECL __declspec(dllimport)
00054 # else
00055 # define PERFTOOLS_DLL_DECL
00056 # endif
00057 #endif
00058
00059
00060 class PERFTOOLS_DLL_DECL MallocHook {
00061 public:
00062
00063
00064 typedef void (*NewHook)(const void* ptr, size_t size);
00065 inline static NewHook GetNewHook() { return new_hook_; }
00066 inline static NewHook SetNewHook(NewHook hook) {
00067 NewHook result = new_hook_;
00068 new_hook_ = hook;
00069 return result;
00070 }
00071 inline static void InvokeNewHook(const void* p, size_t s) {
00072 if (new_hook_ != NULL) (*new_hook_)(p, s);
00073 }
00074
00075
00076
00077 typedef void (*DeleteHook)(const void* ptr);
00078 inline static DeleteHook GetDeleteHook() { return delete_hook_; }
00079 inline static DeleteHook SetDeleteHook(DeleteHook hook) {
00080 DeleteHook result = delete_hook_;
00081 delete_hook_ = hook;
00082 return result;
00083 }
00084 inline static void InvokeDeleteHook(const void* p) {
00085 if (delete_hook_ != NULL) (*delete_hook_)(p);
00086 }
00087
00088
00089
00090 typedef void (*MmapHook)(const void* result,
00091 const void* start,
00092 size_t size,
00093 int protection,
00094 int flags,
00095 int fd,
00096 off_t offset);
00097 inline static MmapHook GetMmapHook() { return mmap_hook_; }
00098 inline static MmapHook SetMmapHook(MmapHook hook) {
00099 MmapHook result = mmap_hook_;
00100 mmap_hook_ = hook;
00101 return result;
00102 }
00103 inline static void InvokeMmapHook(const void* result,
00104 const void* start,
00105 size_t size,
00106 int protection,
00107 int flags,
00108 int fd,
00109 off_t offset) {
00110 if (mmap_hook_ != NULL) (*mmap_hook_)(result,
00111 start, size,
00112 protection, flags,
00113 fd, offset);
00114 }
00115
00116
00117 typedef void (*MunmapHook)(const void* ptr, size_t size);
00118 inline static MunmapHook GetMunmapHook() { return munmap_hook_; }
00119 inline static MunmapHook SetMunmapHook(MunmapHook hook) {
00120 MunmapHook result = munmap_hook_;
00121 munmap_hook_ = hook;
00122 return result;
00123 }
00124 inline static void InvokeMunmapHook(const void* p, size_t size) {
00125 if (munmap_hook_ != NULL) (*munmap_hook_)(p, size);
00126 }
00127
00128
00129 typedef void (*MremapHook)(const void* result,
00130 const void* old_addr,
00131 size_t old_size,
00132 size_t new_size,
00133 int flags,
00134 const void* new_addr);
00135 inline static MremapHook GetMremapHook() { return mremap_hook_; }
00136 inline static MremapHook SetMremapHook(MremapHook hook) {
00137 MremapHook result = mremap_hook_;
00138 mremap_hook_ = hook;
00139 return result;
00140 }
00141 inline static void InvokeMremapHook(const void* result,
00142 const void* old_addr,
00143 size_t old_size,
00144 size_t new_size,
00145 int flags,
00146 const void* new_addr) {
00147 if (mremap_hook_ != NULL) (*mremap_hook_)(result,
00148 old_addr, old_size,
00149 new_size, flags, new_addr);
00150 }
00151
00152
00153
00154
00155
00156 typedef void (*SbrkHook)(const void* result, ptrdiff_t increment);
00157 inline static SbrkHook GetSbrkHook() { return sbrk_hook_; }
00158 inline static SbrkHook SetSbrkHook(SbrkHook hook) {
00159 SbrkHook result = sbrk_hook_;
00160 sbrk_hook_ = hook;
00161 return result;
00162 }
00163 inline static void InvokeSbrkHook(const void* result, ptrdiff_t increment) {
00164 if (sbrk_hook_ != NULL && increment != 0) (*sbrk_hook_)(result, increment);
00165 }
00166
00167
00168
00169
00170
00171
00172 static int GetCallerStackTrace(void** result, int max_depth, int skip_count);
00173
00174 private:
00175
00176 static NewHook new_hook_;
00177 static DeleteHook delete_hook_;
00178 static MmapHook mmap_hook_;
00179 static MunmapHook munmap_hook_;
00180 static MremapHook mremap_hook_;
00181 static SbrkHook sbrk_hook_;
00182 };
00183
00184 #endif