RakMemoryOverride.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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. /// \file
  11. /// \brief If _USE_RAK_MEMORY_OVERRIDE is defined, memory allocations go through rakMalloc, rakRealloc, and rakFree
  12. ///
  13. #ifndef __RAK_MEMORY_H
  14. #define __RAK_MEMORY_H
  15. #include "Export.h"
  16. #include "RakNetDefines.h"
  17. #include <new>
  18. #include "RakAlloca.h"
  19. // #if _USE_RAK_MEMORY_OVERRIDE==1
  20. // #if defined(new)
  21. // #pragma push_macro("new")
  22. // #undef new
  23. // #define RMO_NEW_UNDEF
  24. // #endif
  25. // #endif
  26. // These pointers are statically and globally defined in RakMemoryOverride.cpp
  27. // Change them to point to your own allocators if you want.
  28. // Use the functions for a DLL, or just reassign the variable if using source
  29. extern RAK_DLL_EXPORT void * (*rakMalloc) (size_t size);
  30. extern RAK_DLL_EXPORT void * (*rakRealloc) (void *p, size_t size);
  31. extern RAK_DLL_EXPORT void (*rakFree) (void *p);
  32. extern RAK_DLL_EXPORT void * (*rakMalloc_Ex) (size_t size, const char *file, unsigned int line);
  33. extern RAK_DLL_EXPORT void * (*rakRealloc_Ex) (void *p, size_t size, const char *file, unsigned int line);
  34. extern RAK_DLL_EXPORT void (*rakFree_Ex) (void *p, const char *file, unsigned int line);
  35. extern RAK_DLL_EXPORT void (*notifyOutOfMemory) (const char *file, const long line);
  36. extern RAK_DLL_EXPORT void * (*dlMallocMMap) (size_t size);
  37. extern RAK_DLL_EXPORT void * (*dlMallocDirectMMap) (size_t size);
  38. extern RAK_DLL_EXPORT int (*dlMallocMUnmap) (void* ptr, size_t size);
  39. // Change to a user defined allocation function
  40. void RAK_DLL_EXPORT SetMalloc( void* (*userFunction)(size_t size) );
  41. void RAK_DLL_EXPORT SetRealloc( void* (*userFunction)(void *p, size_t size) );
  42. void RAK_DLL_EXPORT SetFree( void (*userFunction)(void *p) );
  43. void RAK_DLL_EXPORT SetMalloc_Ex( void* (*userFunction)(size_t size, const char *file, unsigned int line) );
  44. void RAK_DLL_EXPORT SetRealloc_Ex( void* (*userFunction)(void *p, size_t size, const char *file, unsigned int line) );
  45. void RAK_DLL_EXPORT SetFree_Ex( void (*userFunction)(void *p, const char *file, unsigned int line) );
  46. // Change to a user defined out of memory function
  47. void RAK_DLL_EXPORT SetNotifyOutOfMemory( void (*userFunction)(const char *file, const long line) );
  48. void RAK_DLL_EXPORT SetDLMallocMMap( void* (*userFunction)(size_t size) );
  49. void RAK_DLL_EXPORT SetDLMallocDirectMMap( void* (*userFunction)(size_t size) );
  50. void RAK_DLL_EXPORT SetDLMallocMUnmap( int (*userFunction)(void* ptr, size_t size) );
  51. extern RAK_DLL_EXPORT void * (*GetMalloc()) (size_t size);
  52. extern RAK_DLL_EXPORT void * (*GetRealloc()) (void *p, size_t size);
  53. extern RAK_DLL_EXPORT void (*GetFree()) (void *p);
  54. extern RAK_DLL_EXPORT void * (*GetMalloc_Ex()) (size_t size, const char *file, unsigned int line);
  55. extern RAK_DLL_EXPORT void * (*GetRealloc_Ex()) (void *p, size_t size, const char *file, unsigned int line);
  56. extern RAK_DLL_EXPORT void (*GetFree_Ex()) (void *p, const char *file, unsigned int line);
  57. extern RAK_DLL_EXPORT void *(*GetDLMallocMMap())(size_t size);
  58. extern RAK_DLL_EXPORT void *(*GetDLMallocDirectMMap())(size_t size);
  59. extern RAK_DLL_EXPORT int (*GetDLMallocMUnmap())(void* ptr, size_t size);
  60. namespace RakNet
  61. {
  62. template <class Type>
  63. RAK_DLL_EXPORT Type* OP_NEW(const char *file, unsigned int line)
  64. {
  65. #if _USE_RAK_MEMORY_OVERRIDE==1
  66. char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
  67. Type *t = new (buffer) Type;
  68. return t;
  69. #else
  70. (void) file;
  71. (void) line;
  72. return new Type;
  73. #endif
  74. }
  75. template <class Type, class P1>
  76. RAK_DLL_EXPORT Type* OP_NEW_1(const char *file, unsigned int line, const P1 &p1)
  77. {
  78. #if _USE_RAK_MEMORY_OVERRIDE==1
  79. char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
  80. Type *t = new (buffer) Type(p1);
  81. return t;
  82. #else
  83. (void) file;
  84. (void) line;
  85. return new Type(p1);
  86. #endif
  87. }
  88. template <class Type, class P1, class P2>
  89. RAK_DLL_EXPORT Type* OP_NEW_2(const char *file, unsigned int line, const P1 &p1, const P2 &p2)
  90. {
  91. #if _USE_RAK_MEMORY_OVERRIDE==1
  92. char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
  93. Type *t = new (buffer) Type(p1, p2);
  94. return t;
  95. #else
  96. (void) file;
  97. (void) line;
  98. return new Type(p1, p2);
  99. #endif
  100. }
  101. template <class Type, class P1, class P2, class P3>
  102. RAK_DLL_EXPORT Type* OP_NEW_3(const char *file, unsigned int line, const P1 &p1, const P2 &p2, const P3 &p3)
  103. {
  104. #if _USE_RAK_MEMORY_OVERRIDE==1
  105. char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
  106. Type *t = new (buffer) Type(p1, p2, p3);
  107. return t;
  108. #else
  109. (void) file;
  110. (void) line;
  111. return new Type(p1, p2, p3);
  112. #endif
  113. }
  114. template <class Type, class P1, class P2, class P3, class P4>
  115. RAK_DLL_EXPORT Type* OP_NEW_4(const char *file, unsigned int line, const P1 &p1, const P2 &p2, const P3 &p3, const P4 &p4)
  116. {
  117. #if _USE_RAK_MEMORY_OVERRIDE==1
  118. char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
  119. Type *t = new (buffer) Type(p1, p2, p3, p4);
  120. return t;
  121. #else
  122. (void) file;
  123. (void) line;
  124. return new Type(p1, p2, p3, p4);
  125. #endif
  126. }
  127. template <class Type>
  128. RAK_DLL_EXPORT Type* OP_NEW_ARRAY(const int count, const char *file, unsigned int line)
  129. {
  130. if (count==0)
  131. return 0;
  132. #if _USE_RAK_MEMORY_OVERRIDE==1
  133. // Type *t;
  134. char *buffer = (char *) (GetMalloc_Ex())(sizeof(int)+sizeof(Type)*count, file, line);
  135. ((int*)buffer)[0]=count;
  136. for (int i=0; i<count; i++)
  137. {
  138. //t =
  139. new(buffer+sizeof(int)+i*sizeof(Type)) Type;
  140. }
  141. return (Type *) (buffer+sizeof(int));
  142. #else
  143. (void) file;
  144. (void) line;
  145. return new Type[count];
  146. #endif
  147. }
  148. template <class Type>
  149. RAK_DLL_EXPORT void OP_DELETE(Type *buff, const char *file, unsigned int line)
  150. {
  151. #if _USE_RAK_MEMORY_OVERRIDE==1
  152. if (buff==0) return;
  153. buff->~Type();
  154. (GetFree_Ex())((char*)buff, file, line );
  155. #else
  156. (void) file;
  157. (void) line;
  158. delete buff;
  159. #endif
  160. }
  161. template <class Type>
  162. RAK_DLL_EXPORT void OP_DELETE_ARRAY(Type *buff, const char *file, unsigned int line)
  163. {
  164. #if _USE_RAK_MEMORY_OVERRIDE==1
  165. if (buff==0)
  166. return;
  167. int count = ((int*)((char*)buff-sizeof(int)))[0];
  168. Type *t;
  169. for (int i=0; i<count; i++)
  170. {
  171. t = buff+i;
  172. t->~Type();
  173. }
  174. (GetFree_Ex())((char*)buff-sizeof(int), file, line );
  175. #else
  176. (void) file;
  177. (void) line;
  178. delete [] buff;
  179. #endif
  180. }
  181. void RAK_DLL_EXPORT * _RakMalloc (size_t size);
  182. void RAK_DLL_EXPORT * _RakRealloc (void *p, size_t size);
  183. void RAK_DLL_EXPORT _RakFree (void *p);
  184. void RAK_DLL_EXPORT * _RakMalloc_Ex (size_t size, const char *file, unsigned int line);
  185. void RAK_DLL_EXPORT * _RakRealloc_Ex (void *p, size_t size, const char *file, unsigned int line);
  186. void RAK_DLL_EXPORT _RakFree_Ex (void *p, const char *file, unsigned int line);
  187. void RAK_DLL_EXPORT * _DLMallocMMap (size_t size);
  188. void RAK_DLL_EXPORT * _DLMallocDirectMMap (size_t size);
  189. int RAK_DLL_EXPORT _DLMallocMUnmap (void *p, size_t size);
  190. }
  191. // Call to make RakNet allocate a large block of memory, and do all subsequent allocations in that memory block
  192. // Initial and reallocations will be done through whatever function is pointed to by yourMMapFunction, and yourDirectMMapFunction (default is malloc)
  193. // Allocations will be freed through whatever function is pointed to by yourMUnmapFunction (default free)
  194. void UseRaknetFixedHeap(size_t initialCapacity,
  195. void * (*yourMMapFunction) (size_t size) = RakNet::_DLMallocMMap,
  196. void * (*yourDirectMMapFunction) (size_t size) = RakNet::_DLMallocDirectMMap,
  197. int (*yourMUnmapFunction) (void *p, size_t size) = RakNet::_DLMallocMUnmap);
  198. // Free memory allocated from UseRaknetFixedHeap
  199. void FreeRakNetFixedHeap(void);
  200. // #if _USE_RAK_MEMORY_OVERRIDE==1
  201. // #if defined(RMO_NEW_UNDEF)
  202. // #pragma pop_macro("new")
  203. // #undef RMO_NEW_UNDEF
  204. // #endif
  205. // #endif
  206. #endif
粤ICP备19079148号