![]() |
Shadowrun: Awakened 29 September 2011 - Build 871
|
00001 00002 00003 00004 00005 00006 00007 00008 00009 #ifndef __RAK_MEMORY_H 00010 #define __RAK_MEMORY_H 00011 00012 #include "Export.h" 00013 #include "RakNetDefines.h" 00014 #include <new> 00015 00016 00017 00018 00019 00020 00021 00022 #include "RakAlloca.h" 00023 00024 // #if _USE_RAK_MEMORY_OVERRIDE==1 00025 // #if defined(new) 00026 // #pragma push_macro("new") 00027 // #undef new 00028 // #define RMO_NEW_UNDEF 00029 // #endif 00030 // #endif 00031 00032 00033 // These pointers are statically and globally defined in RakMemoryOverride.cpp 00034 // Change them to point to your own allocators if you want. 00035 // Use the functions for a DLL, or just reassign the variable if using source 00036 extern RAK_DLL_EXPORT void * (*rakMalloc) (size_t size); 00037 extern RAK_DLL_EXPORT void * (*rakRealloc) (void *p, size_t size); 00038 extern RAK_DLL_EXPORT void (*rakFree) (void *p); 00039 extern RAK_DLL_EXPORT void * (*rakMalloc_Ex) (size_t size, const char *file, unsigned int line); 00040 extern RAK_DLL_EXPORT void * (*rakRealloc_Ex) (void *p, size_t size, const char *file, unsigned int line); 00041 extern RAK_DLL_EXPORT void (*rakFree_Ex) (void *p, const char *file, unsigned int line); 00042 extern RAK_DLL_EXPORT void (*notifyOutOfMemory) (const char *file, const long line); 00043 extern RAK_DLL_EXPORT void * (*dlMallocMMap) (size_t size); 00044 extern RAK_DLL_EXPORT void * (*dlMallocDirectMMap) (size_t size); 00045 extern RAK_DLL_EXPORT int (*dlMallocMUnmap) (void* ptr, size_t size); 00046 00047 // Change to a user defined allocation function 00048 void RAK_DLL_EXPORT SetMalloc( void* (*userFunction)(size_t size) ); 00049 void RAK_DLL_EXPORT SetRealloc( void* (*userFunction)(void *p, size_t size) ); 00050 void RAK_DLL_EXPORT SetFree( void (*userFunction)(void *p) ); 00051 void RAK_DLL_EXPORT SetMalloc_Ex( void* (*userFunction)(size_t size, const char *file, unsigned int line) ); 00052 void RAK_DLL_EXPORT SetRealloc_Ex( void* (*userFunction)(void *p, size_t size, const char *file, unsigned int line) ); 00053 void RAK_DLL_EXPORT SetFree_Ex( void (*userFunction)(void *p, const char *file, unsigned int line) ); 00054 // Change to a user defined out of memory function 00055 void RAK_DLL_EXPORT SetNotifyOutOfMemory( void (*userFunction)(const char *file, const long line) ); 00056 void RAK_DLL_EXPORT SetDLMallocMMap( void* (*userFunction)(size_t size) ); 00057 void RAK_DLL_EXPORT SetDLMallocDirectMMap( void* (*userFunction)(size_t size) ); 00058 void RAK_DLL_EXPORT SetDLMallocMUnmap( int (*userFunction)(void* ptr, size_t size) ); 00059 00060 extern RAK_DLL_EXPORT void * (*GetMalloc()) (size_t size); 00061 extern RAK_DLL_EXPORT void * (*GetRealloc()) (void *p, size_t size); 00062 extern RAK_DLL_EXPORT void (*GetFree()) (void *p); 00063 extern RAK_DLL_EXPORT void * (*GetMalloc_Ex()) (size_t size, const char *file, unsigned int line); 00064 extern RAK_DLL_EXPORT void * (*GetRealloc_Ex()) (void *p, size_t size, const char *file, unsigned int line); 00065 extern RAK_DLL_EXPORT void (*GetFree_Ex()) (void *p, const char *file, unsigned int line); 00066 extern RAK_DLL_EXPORT void *(*GetDLMallocMMap())(size_t size); 00067 extern RAK_DLL_EXPORT void *(*GetDLMallocDirectMMap())(size_t size); 00068 extern RAK_DLL_EXPORT int (*GetDLMallocMUnmap())(void* ptr, size_t size); 00069 00070 namespace RakNet 00071 { 00072 00073 template <class Type> 00074 RAK_DLL_EXPORT Type* OP_NEW(const char *file, unsigned int line) 00075 { 00076 #if _USE_RAK_MEMORY_OVERRIDE==1 00077 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); 00078 Type *t = new (buffer) Type; 00079 return t; 00080 #else 00081 (void) file; 00082 (void) line; 00083 return new Type; 00084 #endif 00085 } 00086 00087 template <class Type, class P1> 00088 RAK_DLL_EXPORT Type* OP_NEW_1(const char *file, unsigned int line, const P1 &p1) 00089 { 00090 #if _USE_RAK_MEMORY_OVERRIDE==1 00091 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); 00092 Type *t = new (buffer) Type(p1); 00093 return t; 00094 #else 00095 (void) file; 00096 (void) line; 00097 return new Type(p1); 00098 #endif 00099 } 00100 00101 template <class Type, class P1, class P2> 00102 RAK_DLL_EXPORT Type* OP_NEW_2(const char *file, unsigned int line, const P1 &p1, const P2 &p2) 00103 { 00104 #if _USE_RAK_MEMORY_OVERRIDE==1 00105 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); 00106 Type *t = new (buffer) Type(p1, p2); 00107 return t; 00108 #else 00109 (void) file; 00110 (void) line; 00111 return new Type(p1, p2); 00112 #endif 00113 } 00114 00115 template <class Type, class P1, class P2, class P3> 00116 RAK_DLL_EXPORT Type* OP_NEW_3(const char *file, unsigned int line, const P1 &p1, const P2 &p2, const P3 &p3) 00117 { 00118 #if _USE_RAK_MEMORY_OVERRIDE==1 00119 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); 00120 Type *t = new (buffer) Type(p1, p2, p3); 00121 return t; 00122 #else 00123 (void) file; 00124 (void) line; 00125 return new Type(p1, p2, p3); 00126 #endif 00127 } 00128 00129 template <class Type, class P1, class P2, class P3, class P4> 00130 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) 00131 { 00132 #if _USE_RAK_MEMORY_OVERRIDE==1 00133 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); 00134 Type *t = new (buffer) Type(p1, p2, p3, p4); 00135 return t; 00136 #else 00137 (void) file; 00138 (void) line; 00139 return new Type(p1, p2, p3, p4); 00140 #endif 00141 } 00142 00143 00144 template <class Type> 00145 RAK_DLL_EXPORT Type* OP_NEW_ARRAY(const int count, const char *file, unsigned int line) 00146 { 00147 if (count==0) 00148 return 0; 00149 00150 #if _USE_RAK_MEMORY_OVERRIDE==1 00151 // Type *t; 00152 char *buffer = (char *) (GetMalloc_Ex())(sizeof(int)+sizeof(Type)*count, file, line); 00153 ((int*)buffer)[0]=count; 00154 for (int i=0; i<count; i++) 00155 { 00156 //t = 00157 new(buffer+sizeof(int)+i*sizeof(Type)) Type; 00158 } 00159 return (Type *) (buffer+sizeof(int)); 00160 #else 00161 (void) file; 00162 (void) line; 00163 return new Type[count]; 00164 #endif 00165 00166 } 00167 00168 template <class Type> 00169 RAK_DLL_EXPORT void OP_DELETE(Type *buff, const char *file, unsigned int line) 00170 { 00171 #if _USE_RAK_MEMORY_OVERRIDE==1 00172 if (buff==0) return; 00173 buff->~Type(); 00174 (GetFree_Ex())((char*)buff, file, line ); 00175 #else 00176 (void) file; 00177 (void) line; 00178 delete buff; 00179 #endif 00180 00181 } 00182 00183 template <class Type> 00184 RAK_DLL_EXPORT void OP_DELETE_ARRAY(Type *buff, const char *file, unsigned int line) 00185 { 00186 #if _USE_RAK_MEMORY_OVERRIDE==1 00187 if (buff==0) 00188 return; 00189 00190 int count = ((int*)((char*)buff-sizeof(int)))[0]; 00191 Type *t; 00192 for (int i=0; i<count; i++) 00193 { 00194 t = buff+i; 00195 t->~Type(); 00196 } 00197 (GetFree_Ex())((char*)buff-sizeof(int), file, line ); 00198 #else 00199 (void) file; 00200 (void) line; 00201 delete [] buff; 00202 #endif 00203 00204 } 00205 00206 void RAK_DLL_EXPORT * _RakMalloc (size_t size); 00207 void RAK_DLL_EXPORT * _RakRealloc (void *p, size_t size); 00208 void RAK_DLL_EXPORT _RakFree (void *p); 00209 void RAK_DLL_EXPORT * _RakMalloc_Ex (size_t size, const char *file, unsigned int line); 00210 void RAK_DLL_EXPORT * _RakRealloc_Ex (void *p, size_t size, const char *file, unsigned int line); 00211 void RAK_DLL_EXPORT _RakFree_Ex (void *p, const char *file, unsigned int line); 00212 void RAK_DLL_EXPORT * _DLMallocMMap (size_t size); 00213 void RAK_DLL_EXPORT * _DLMallocDirectMMap (size_t size); 00214 int RAK_DLL_EXPORT _DLMallocMUnmap (void *p, size_t size); 00215 00216 } 00217 00218 // Call to make RakNet allocate a large block of memory, and do all subsequent allocations in that memory block 00219 // Initial and reallocations will be done through whatever function is pointed to by yourMMapFunction, and yourDirectMMapFunction (default is malloc) 00220 // Allocations will be freed through whatever function is pointed to by yourMUnmapFunction (default free) 00221 void UseRaknetFixedHeap(size_t initialCapacity, 00222 void * (*yourMMapFunction) (size_t size) = RakNet::_DLMallocMMap, 00223 void * (*yourDirectMMapFunction) (size_t size) = RakNet::_DLMallocDirectMMap, 00224 int (*yourMUnmapFunction) (void *p, size_t size) = RakNet::_DLMallocMUnmap); 00225 00226 // Free memory allocated from UseRaknetFixedHeap 00227 void FreeRakNetFixedHeap(void); 00228 00229 // #if _USE_RAK_MEMORY_OVERRIDE==1 00230 // #if defined(RMO_NEW_UNDEF) 00231 // #pragma pop_macro("new") 00232 // #undef RMO_NEW_UNDEF 00233 // #endif 00234 // #endif 00235 00236 #endif
Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.