00001 #include "RakMemoryOverride.h"
00002 #include "RakAssert.h"
00003 #include <stdlib.h>
00004
00005 #ifdef _RAKNET_SUPPORT_DL_MALLOC
00006 #include "rdlmalloc.h"
00007 #endif
00008
00009 #if defined(_PS3) || defined(__PS3__) || defined(SN_TARGET_PS3)
00010
00011 #endif
00012
00013 using namespace RakNet;
00014
00015 #if _USE_RAK_MEMORY_OVERRIDE==1
00016 #if defined(malloc)
00017 #pragma push_macro("malloc")
00018 #undef malloc
00019 #define RMO_MALLOC_UNDEF
00020 #endif
00021
00022 #if defined(realloc)
00023 #pragma push_macro("realloc")
00024 #undef realloc
00025 #define RMO_REALLOC_UNDEF
00026 #endif
00027
00028 #if defined(free)
00029 #pragma push_macro("free")
00030 #undef free
00031 #define RMO_FREE_UNDEF
00032 #endif
00033 #endif
00034
00035 void DefaultOutOfMemoryHandler(const char *file, const long line)
00036 {
00037 (void) file;
00038 (void) line;
00039 RakAssert(0);
00040 }
00041
00042 void * (*rakMalloc) (size_t size) = RakNet::_RakMalloc;
00043 void* (*rakRealloc) (void *p, size_t size) = RakNet::_RakRealloc;
00044 void (*rakFree) (void *p) = RakNet::_RakFree;
00045 void* (*rakMalloc_Ex) (size_t size, const char *file, unsigned int line) = RakNet::_RakMalloc_Ex;
00046 void* (*rakRealloc_Ex) (void *p, size_t size, const char *file, unsigned int line) = RakNet::_RakRealloc_Ex;
00047 void (*rakFree_Ex) (void *p, const char *file, unsigned int line) = RakNet::_RakFree_Ex;
00048 void (*notifyOutOfMemory) (const char *file, const long line)=DefaultOutOfMemoryHandler;
00049 void * (*dlMallocMMap) (size_t size) = RakNet::_DLMallocMMap;
00050 void * (*dlMallocDirectMMap) (size_t size) = RakNet::_DLMallocDirectMMap;
00051 int (*dlMallocMUnmap) (void* ptr, size_t size) = RakNet::_DLMallocMUnmap;
00052
00053 void SetMalloc( void* (*userFunction)(size_t size) )
00054 {
00055 rakMalloc=userFunction;
00056 }
00057 void SetRealloc( void* (*userFunction)(void *p, size_t size) )
00058 {
00059 rakRealloc=userFunction;
00060 }
00061 void SetFree( void (*userFunction)(void *p) )
00062 {
00063 rakFree=userFunction;
00064 }
00065 void SetMalloc_Ex( void* (*userFunction)(size_t size, const char *file, unsigned int line) )
00066 {
00067 rakMalloc_Ex=userFunction;
00068 }
00069 void SetRealloc_Ex( void* (*userFunction)(void *p, size_t size, const char *file, unsigned int line) )
00070 {
00071 rakRealloc_Ex=userFunction;
00072 }
00073 void SetFree_Ex( void (*userFunction)(void *p, const char *file, unsigned int line) )
00074 {
00075 rakFree_Ex=userFunction;
00076 }
00077 void SetNotifyOutOfMemory( void (*userFunction)(const char *file, const long line) )
00078 {
00079 notifyOutOfMemory=userFunction;
00080 }
00081 void SetDLMallocMMap( void* (*userFunction)(size_t size) )
00082 {
00083 dlMallocMMap=userFunction;
00084 }
00085 void SetDLMallocDirectMMap( void* (*userFunction)(size_t size) )
00086 {
00087 dlMallocDirectMMap=userFunction;
00088 }
00089 void SetDLMallocMUnmap( int (*userFunction)(void* ptr, size_t size) )
00090 {
00091 dlMallocMUnmap=userFunction;
00092 }
00093 void * (*GetMalloc()) (size_t size)
00094 {
00095 return rakMalloc;
00096 }
00097 void * (*GetRealloc()) (void *p, size_t size)
00098 {
00099 return rakRealloc;
00100 }
00101 void (*GetFree()) (void *p)
00102 {
00103 return rakFree;
00104 }
00105 void * (*GetMalloc_Ex()) (size_t size, const char *file, unsigned int line)
00106 {
00107 return rakMalloc_Ex;
00108 }
00109 void * (*GetRealloc_Ex()) (void *p, size_t size, const char *file, unsigned int line)
00110 {
00111 return rakRealloc_Ex;
00112 }
00113 void (*GetFree_Ex()) (void *p, const char *file, unsigned int line)
00114 {
00115 return rakFree_Ex;
00116 }
00117 void *(*GetDLMallocMMap())(size_t size)
00118 {
00119 return dlMallocMMap;
00120 }
00121 void *(*GetDLMallocDirectMMap())(size_t size)
00122 {
00123 return dlMallocDirectMMap;
00124 }
00125 int (*GetDLMallocMUnmap())(void* ptr, size_t size)
00126 {
00127 return dlMallocMUnmap;
00128 }
00129 void* RakNet::_RakMalloc (size_t size)
00130 {
00131 return malloc(size);
00132 }
00133
00134 void* RakNet::_RakRealloc (void *p, size_t size)
00135 {
00136 return realloc(p,size);
00137 }
00138
00139 void RakNet::_RakFree (void *p)
00140 {
00141 free(p);
00142 }
00143
00144 void* RakNet::_RakMalloc_Ex (size_t size, const char *file, unsigned int line)
00145 {
00146 (void) file;
00147 (void) line;
00148
00149 return malloc(size);
00150 }
00151
00152 void* RakNet::_RakRealloc_Ex (void *p, size_t size, const char *file, unsigned int line)
00153 {
00154 (void) file;
00155 (void) line;
00156
00157 return realloc(p,size);
00158 }
00159
00160 void RakNet::_RakFree_Ex (void *p, const char *file, unsigned int line)
00161 {
00162 (void) file;
00163 (void) line;
00164
00165 free(p);
00166 }
00167 #ifdef _RAKNET_SUPPORT_DL_MALLOC
00168 void * RakNet::_DLMallocMMap (size_t size)
00169 {
00170 return RAK_MMAP_DEFAULT(size);
00171 }
00172 void * RakNet::_DLMallocDirectMMap (size_t size)
00173 {
00174 return RAK_DIRECT_MMAP_DEFAULT(size);
00175 }
00176 int RakNet::_DLMallocMUnmap (void *p, size_t size)
00177 {
00178 return RAK_MUNMAP_DEFAULT(p,size);
00179 }
00180
00181 static mspace rakNetFixedHeapMSpace=0;
00182
00183 void* _DLMalloc(size_t size)
00184 {
00185 return rak_mspace_malloc(rakNetFixedHeapMSpace,size);
00186 }
00187
00188 void* _DLRealloc(void *p, size_t size)
00189 {
00190 return rak_mspace_realloc(rakNetFixedHeapMSpace,p,size);
00191 }
00192
00193 void _DLFree(void *p)
00194 {
00195 if (p)
00196 rak_mspace_free(rakNetFixedHeapMSpace,p);
00197 }
00198 void* _DLMalloc_Ex (size_t size, const char *file, unsigned int line)
00199 {
00200 (void) file;
00201 (void) line;
00202
00203 return rak_mspace_malloc(rakNetFixedHeapMSpace,size);
00204 }
00205
00206 void* _DLRealloc_Ex (void *p, size_t size, const char *file, unsigned int line)
00207 {
00208 (void) file;
00209 (void) line;
00210
00211 return rak_mspace_realloc(rakNetFixedHeapMSpace,p,size);
00212 }
00213
00214 void _DLFree_Ex (void *p, const char *file, unsigned int line)
00215 {
00216 (void) file;
00217 (void) line;
00218
00219 if (p)
00220 rak_mspace_free(rakNetFixedHeapMSpace,p);
00221 }
00222
00223 void UseRaknetFixedHeap(size_t initialCapacity,
00224 void * (*yourMMapFunction) (size_t size),
00225 void * (*yourDirectMMapFunction) (size_t size),
00226 int (*yourMUnmapFunction) (void *p, size_t size))
00227 {
00228 SetDLMallocMMap(yourMMapFunction);
00229 SetDLMallocDirectMMap(yourDirectMMapFunction);
00230 SetDLMallocMUnmap(yourMUnmapFunction);
00231 SetMalloc(_DLMalloc);
00232 SetRealloc(_DLRealloc);
00233 SetFree(_DLFree);
00234 SetMalloc_Ex(_DLMalloc_Ex);
00235 SetRealloc_Ex(_DLRealloc_Ex);
00236 SetFree_Ex(_DLFree_Ex);
00237
00238 rakNetFixedHeapMSpace=rak_create_mspace(initialCapacity, 0);
00239 }
00240 void FreeRakNetFixedHeap(void)
00241 {
00242 if (rakNetFixedHeapMSpace)
00243 {
00244 rak_destroy_mspace(rakNetFixedHeapMSpace);
00245 rakNetFixedHeapMSpace=0;
00246 }
00247
00248 SetMalloc(_RakMalloc);
00249 SetRealloc(_RakRealloc);
00250 SetFree(_RakFree);
00251 SetMalloc_Ex(_RakMalloc_Ex);
00252 SetRealloc_Ex(_RakRealloc_Ex);
00253 SetFree_Ex(_RakFree_Ex);
00254 }
00255 #else
00256 void * RakNet::_DLMallocMMap (size_t size) {(void) size; return 0;}
00257 void * RakNet::_DLMallocDirectMMap (size_t size) {(void) size; return 0;}
00258 int RakNet::_DLMallocMUnmap (void *p, size_t size) {(void) size; (void) p; return 0;}
00259 void* _DLMalloc(size_t size) {(void) size; return 0;}
00260 void* _DLRealloc(void *p, size_t size) {(void) p; (void) size; return 0;}
00261 void _DLFree(void *p) {(void) p;}
00262 void* _DLMalloc_Ex (size_t size, const char *file, unsigned int line) {(void) size; (void) file; (void) line; return 0;}
00263 void* _DLRealloc_Ex (void *p, size_t size, const char *file, unsigned int line) {(void) p; (void) size; (void) file; (void) line; return 0;}
00264 void _DLFree_Ex (void *p, const char *file, unsigned int line) {(void) p; (void) file; (void) line;}
00265
00266 void UseRaknetFixedHeap(size_t initialCapacity,
00267 void * (*yourMMapFunction) (size_t size),
00268 void * (*yourDirectMMapFunction) (size_t size),
00269 int (*yourMUnmapFunction) (void *p, size_t size))
00270 {
00271 (void) initialCapacity;
00272 (void) yourMMapFunction;
00273 (void) yourDirectMMapFunction;
00274 (void) yourMUnmapFunction;
00275 }
00276 void FreeRakNetFixedHeap(void) {}
00277 #endif
00278
00279 #if _USE_RAK_MEMORY_OVERRIDE==1
00280 #if defined(RMO_MALLOC_UNDEF)
00281 #pragma pop_macro("malloc")
00282 #undef RMO_MALLOC_UNDEF
00283 #endif
00284
00285 #if defined(RMO_REALLOC_UNDEF)
00286 #pragma pop_macro("realloc")
00287 #undef RMO_REALLOC_UNDEF
00288 #endif
00289
00290 #if defined(RMO_FREE_UNDEF)
00291 #pragma pop_macro("free")
00292 #undef RMO_FREE_UNDEF
00293 #endif
00294 #endif