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