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