RakMemoryOverride.cpp 7.5 KB

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