1 #include "RakMemoryOverride.h"
2 #include "RakAssert.h"
3 #include <stdlib.h>
4
5 #ifdef _RAKNET_SUPPORT_DL_MALLOC
6 #include "rdlmalloc.h"
7 #endif
8
9
10
11
12
13 using namespace RakNet;
14
15 #if _USE_RAK_MEMORY_OVERRIDE==1
16 #if defined(malloc)
17 #pragma push_macro("malloc")
18 #undef malloc
19 #define RMO_MALLOC_UNDEF
20 #endif
21
22 #if defined(realloc)
23 #pragma push_macro("realloc")
24 #undef realloc
25 #define RMO_REALLOC_UNDEF
26 #endif
27
28 #if defined(free)
29 #pragma push_macro("free")
30 #undef free
31 #define RMO_FREE_UNDEF
32 #endif
33 #endif
34
DefaultOutOfMemoryHandler(const char * file,const long line)35 void DefaultOutOfMemoryHandler(const char *file, const long line)
36 {
37 (void) file;
38 (void) line;
39 RakAssert(0);
40 }
41
42 void * (*rakMalloc) (size_t size) = RakNet::_RakMalloc;
43 void* (*rakRealloc) (void *p, size_t size) = RakNet::_RakRealloc;
44 void (*rakFree) (void *p) = RakNet::_RakFree;
45 void* (*rakMalloc_Ex) (size_t size, const char *file, unsigned int line) = RakNet::_RakMalloc_Ex;
46 void* (*rakRealloc_Ex) (void *p, size_t size, const char *file, unsigned int line) = RakNet::_RakRealloc_Ex;
47 void (*rakFree_Ex) (void *p, const char *file, unsigned int line) = RakNet::_RakFree_Ex;
48 void (*notifyOutOfMemory) (const char *file, const long line)=DefaultOutOfMemoryHandler;
49 void * (*dlMallocMMap) (size_t size) = RakNet::_DLMallocMMap;
50 void * (*dlMallocDirectMMap) (size_t size) = RakNet::_DLMallocDirectMMap;
51 int (*dlMallocMUnmap) (void* ptr, size_t size) = RakNet::_DLMallocMUnmap;
52
SetMalloc(void * (* userFunction)(size_t size))53 void SetMalloc( void* (*userFunction)(size_t size) )
54 {
55 rakMalloc=userFunction;
56 }
SetRealloc(void * (* userFunction)(void * p,size_t size))57 void SetRealloc( void* (*userFunction)(void *p, size_t size) )
58 {
59 rakRealloc=userFunction;
60 }
SetFree(void (* userFunction)(void * p))61 void SetFree( void (*userFunction)(void *p) )
62 {
63 rakFree=userFunction;
64 }
SetMalloc_Ex(void * (* userFunction)(size_t size,const char * file,unsigned int line))65 void SetMalloc_Ex( void* (*userFunction)(size_t size, const char *file, unsigned int line) )
66 {
67 rakMalloc_Ex=userFunction;
68 }
SetRealloc_Ex(void * (* userFunction)(void * p,size_t size,const char * file,unsigned int line))69 void SetRealloc_Ex( void* (*userFunction)(void *p, size_t size, const char *file, unsigned int line) )
70 {
71 rakRealloc_Ex=userFunction;
72 }
SetFree_Ex(void (* userFunction)(void * p,const char * file,unsigned int line))73 void SetFree_Ex( void (*userFunction)(void *p, const char *file, unsigned int line) )
74 {
75 rakFree_Ex=userFunction;
76 }
SetNotifyOutOfMemory(void (* userFunction)(const char * file,const long line))77 void SetNotifyOutOfMemory( void (*userFunction)(const char *file, const long line) )
78 {
79 notifyOutOfMemory=userFunction;
80 }
SetDLMallocMMap(void * (* userFunction)(size_t size))81 void SetDLMallocMMap( void* (*userFunction)(size_t size) )
82 {
83 dlMallocMMap=userFunction;
84 }
SetDLMallocDirectMMap(void * (* userFunction)(size_t size))85 void SetDLMallocDirectMMap( void* (*userFunction)(size_t size) )
86 {
87 dlMallocDirectMMap=userFunction;
88 }
SetDLMallocMUnmap(int (* userFunction)(void * ptr,size_t size))89 void SetDLMallocMUnmap( int (*userFunction)(void* ptr, size_t size) )
90 {
91 dlMallocMUnmap=userFunction;
92 }
GetMalloc()93 void * (*GetMalloc()) (size_t size)
94 {
95 return rakMalloc;
96 }
GetRealloc()97 void * (*GetRealloc()) (void *p, size_t size)
98 {
99 return rakRealloc;
100 }
GetFree()101 void (*GetFree()) (void *p)
102 {
103 return rakFree;
104 }
GetMalloc_Ex()105 void * (*GetMalloc_Ex()) (size_t size, const char *file, unsigned int line)
106 {
107 return rakMalloc_Ex;
108 }
GetRealloc_Ex()109 void * (*GetRealloc_Ex()) (void *p, size_t size, const char *file, unsigned int line)
110 {
111 return rakRealloc_Ex;
112 }
GetFree_Ex()113 void (*GetFree_Ex()) (void *p, const char *file, unsigned int line)
114 {
115 return rakFree_Ex;
116 }
GetDLMallocMMap()117 void *(*GetDLMallocMMap())(size_t size)
118 {
119 return dlMallocMMap;
120 }
GetDLMallocDirectMMap()121 void *(*GetDLMallocDirectMMap())(size_t size)
122 {
123 return dlMallocDirectMMap;
124 }
GetDLMallocMUnmap()125 int (*GetDLMallocMUnmap())(void* ptr, size_t size)
126 {
127 return dlMallocMUnmap;
128 }
_RakMalloc(size_t size)129 void* RakNet::_RakMalloc (size_t size)
130 {
131 return malloc(size);
132 }
133
_RakRealloc(void * p,size_t size)134 void* RakNet::_RakRealloc (void *p, size_t size)
135 {
136 return realloc(p,size);
137 }
138
_RakFree(void * p)139 void RakNet::_RakFree (void *p)
140 {
141 free(p);
142 }
143
_RakMalloc_Ex(size_t size,const char * file,unsigned int line)144 void* RakNet::_RakMalloc_Ex (size_t size, const char *file, unsigned int line)
145 {
146 (void) file;
147 (void) line;
148
149 return malloc(size);
150 }
151
_RakRealloc_Ex(void * p,size_t size,const char * file,unsigned int line)152 void* RakNet::_RakRealloc_Ex (void *p, size_t size, const char *file, unsigned int line)
153 {
154 (void) file;
155 (void) line;
156
157 return realloc(p,size);
158 }
159
_RakFree_Ex(void * p,const char * file,unsigned int line)160 void RakNet::_RakFree_Ex (void *p, const char *file, unsigned int line)
161 {
162 (void) file;
163 (void) line;
164
165 free(p);
166 }
167 #ifdef _RAKNET_SUPPORT_DL_MALLOC
_DLMallocMMap(size_t size)168 void * RakNet::_DLMallocMMap (size_t size)
169 {
170 return RAK_MMAP_DEFAULT(size);
171 }
_DLMallocDirectMMap(size_t size)172 void * RakNet::_DLMallocDirectMMap (size_t size)
173 {
174 return RAK_DIRECT_MMAP_DEFAULT(size);
175 }
_DLMallocMUnmap(void * p,size_t size)176 int RakNet::_DLMallocMUnmap (void *p, size_t size)
177 {
178 return RAK_MUNMAP_DEFAULT(p,size);
179 }
180
181 static mspace rakNetFixedHeapMSpace=0;
182
_DLMalloc(size_t size)183 void* _DLMalloc(size_t size)
184 {
185 return rak_mspace_malloc(rakNetFixedHeapMSpace,size);
186 }
187
_DLRealloc(void * p,size_t size)188 void* _DLRealloc(void *p, size_t size)
189 {
190 return rak_mspace_realloc(rakNetFixedHeapMSpace,p,size);
191 }
192
_DLFree(void * p)193 void _DLFree(void *p)
194 {
195 if (p)
196 rak_mspace_free(rakNetFixedHeapMSpace,p);
197 }
_DLMalloc_Ex(size_t size,const char * file,unsigned int line)198 void* _DLMalloc_Ex (size_t size, const char *file, unsigned int line)
199 {
200 (void) file;
201 (void) line;
202
203 return rak_mspace_malloc(rakNetFixedHeapMSpace,size);
204 }
205
_DLRealloc_Ex(void * p,size_t size,const char * file,unsigned int line)206 void* _DLRealloc_Ex (void *p, size_t size, const char *file, unsigned int line)
207 {
208 (void) file;
209 (void) line;
210
211 return rak_mspace_realloc(rakNetFixedHeapMSpace,p,size);
212 }
213
_DLFree_Ex(void * p,const char * file,unsigned int line)214 void _DLFree_Ex (void *p, const char *file, unsigned int line)
215 {
216 (void) file;
217 (void) line;
218
219 if (p)
220 rak_mspace_free(rakNetFixedHeapMSpace,p);
221 }
222
UseRaknetFixedHeap(size_t initialCapacity,void * (* yourMMapFunction)(size_t size),void * (* yourDirectMMapFunction)(size_t size),int (* yourMUnmapFunction)(void * p,size_t size))223 void UseRaknetFixedHeap(size_t initialCapacity,
224 void * (*yourMMapFunction) (size_t size),
225 void * (*yourDirectMMapFunction) (size_t size),
226 int (*yourMUnmapFunction) (void *p, size_t size))
227 {
228 SetDLMallocMMap(yourMMapFunction);
229 SetDLMallocDirectMMap(yourDirectMMapFunction);
230 SetDLMallocMUnmap(yourMUnmapFunction);
231 SetMalloc(_DLMalloc);
232 SetRealloc(_DLRealloc);
233 SetFree(_DLFree);
234 SetMalloc_Ex(_DLMalloc_Ex);
235 SetRealloc_Ex(_DLRealloc_Ex);
236 SetFree_Ex(_DLFree_Ex);
237
238 rakNetFixedHeapMSpace=rak_create_mspace(initialCapacity, 0);
239 }
FreeRakNetFixedHeap(void)240 void FreeRakNetFixedHeap(void)
241 {
242 if (rakNetFixedHeapMSpace)
243 {
244 rak_destroy_mspace(rakNetFixedHeapMSpace);
245 rakNetFixedHeapMSpace=0;
246 }
247
248 SetMalloc(_RakMalloc);
249 SetRealloc(_RakRealloc);
250 SetFree(_RakFree);
251 SetMalloc_Ex(_RakMalloc_Ex);
252 SetRealloc_Ex(_RakRealloc_Ex);
253 SetFree_Ex(_RakFree_Ex);
254 }
255 #else
_DLMallocMMap(size_t size)256 void * RakNet::_DLMallocMMap (size_t size) {(void) size; return 0;}
_DLMallocDirectMMap(size_t size)257 void * RakNet::_DLMallocDirectMMap (size_t size) {(void) size; return 0;}
_DLMallocMUnmap(void * p,size_t size)258 int RakNet::_DLMallocMUnmap (void *p, size_t size) {(void) size; (void) p; return 0;}
_DLMalloc(size_t size)259 void* _DLMalloc(size_t size) {(void) size; return 0;}
_DLRealloc(void * p,size_t size)260 void* _DLRealloc(void *p, size_t size) {(void) p; (void) size; return 0;}
_DLFree(void * p)261 void _DLFree(void *p) {(void) p;}
_DLMalloc_Ex(size_t size,const char * file,unsigned int line)262 void* _DLMalloc_Ex (size_t size, const char *file, unsigned int line) {(void) size; (void) file; (void) line; return 0;}
_DLRealloc_Ex(void * p,size_t size,const char * file,unsigned int line)263 void* _DLRealloc_Ex (void *p, size_t size, const char *file, unsigned int line) {(void) p; (void) size; (void) file; (void) line; return 0;}
_DLFree_Ex(void * p,const char * file,unsigned int line)264 void _DLFree_Ex (void *p, const char *file, unsigned int line) {(void) p; (void) file; (void) line;}
265
UseRaknetFixedHeap(size_t initialCapacity,void * (* yourMMapFunction)(size_t size),void * (* yourDirectMMapFunction)(size_t size),int (* yourMUnmapFunction)(void * p,size_t size))266 void UseRaknetFixedHeap(size_t initialCapacity,
267 void * (*yourMMapFunction) (size_t size),
268 void * (*yourDirectMMapFunction) (size_t size),
269 int (*yourMUnmapFunction) (void *p, size_t size))
270 {
271 (void) initialCapacity;
272 (void) yourMMapFunction;
273 (void) yourDirectMMapFunction;
274 (void) yourMUnmapFunction;
275 }
FreeRakNetFixedHeap(void)276 void FreeRakNetFixedHeap(void) {}
277 #endif
278
279 #if _USE_RAK_MEMORY_OVERRIDE==1
280 #if defined(RMO_MALLOC_UNDEF)
281 #pragma pop_macro("malloc")
282 #undef RMO_MALLOC_UNDEF
283 #endif
284
285 #if defined(RMO_REALLOC_UNDEF)
286 #pragma pop_macro("realloc")
287 #undef RMO_REALLOC_UNDEF
288 #endif
289
290 #if defined(RMO_FREE_UNDEF)
291 #pragma pop_macro("free")
292 #undef RMO_FREE_UNDEF
293 #endif
294 #endif
295