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 #if defined(_PS3) || defined(__PS3__) || defined(SN_TARGET_PS3)
00017
00018 #endif
00019
00020 #include "RakAlloca.h"
00021
00022 #if _USE_RAK_MEMORY_OVERRIDE==1
00023 #if defined(new)
00024 #pragma push_macro("new")
00025 #undef new
00026 #define RMO_NEW_UNDEF
00027 #endif
00028 #endif
00029
00030
00031
00032
00033
00034 extern RAK_DLL_EXPORT void * (*rakMalloc) (size_t size);
00035 extern RAK_DLL_EXPORT void * (*rakRealloc) (void *p, size_t size);
00036 extern RAK_DLL_EXPORT void (*rakFree) (void *p);
00037 extern RAK_DLL_EXPORT void * (*rakMalloc_Ex) (size_t size, const char *file, unsigned int line);
00038 extern RAK_DLL_EXPORT void * (*rakRealloc_Ex) (void *p, size_t size, const char *file, unsigned int line);
00039 extern RAK_DLL_EXPORT void (*rakFree_Ex) (void *p, const char *file, unsigned int line);
00040 extern RAK_DLL_EXPORT void (*notifyOutOfMemory) (const char *file, const long line);
00041 extern RAK_DLL_EXPORT void * (*dlMallocMMap) (size_t size);
00042 extern RAK_DLL_EXPORT void * (*dlMallocDirectMMap) (size_t size);
00043 extern RAK_DLL_EXPORT int (*dlMallocMUnmap) (void* ptr, size_t size);
00044
00045
00046 void RAK_DLL_EXPORT SetMalloc( void* (*userFunction)(size_t size) );
00047 void RAK_DLL_EXPORT SetRealloc( void* (*userFunction)(void *p, size_t size) );
00048 void RAK_DLL_EXPORT SetFree( void (*userFunction)(void *p) );
00049 void RAK_DLL_EXPORT SetMalloc_Ex( void* (*userFunction)(size_t size, const char *file, unsigned int line) );
00050 void RAK_DLL_EXPORT SetRealloc_Ex( void* (*userFunction)(void *p, size_t size, const char *file, unsigned int line) );
00051 void RAK_DLL_EXPORT SetFree_Ex( void (*userFunction)(void *p, const char *file, unsigned int line) );
00052
00053 void RAK_DLL_EXPORT SetNotifyOutOfMemory( void (*userFunction)(const char *file, const long line) );
00054 void RAK_DLL_EXPORT SetDLMallocMMap( void* (*userFunction)(size_t size) );
00055 void RAK_DLL_EXPORT SetDLMallocDirectMMap( void* (*userFunction)(size_t size) );
00056 void RAK_DLL_EXPORT SetDLMallocMUnmap( int (*userFunction)(void* ptr, size_t size) );
00057
00058 extern RAK_DLL_EXPORT void * (*GetMalloc()) (size_t size);
00059 extern RAK_DLL_EXPORT void * (*GetRealloc()) (void *p, size_t size);
00060 extern RAK_DLL_EXPORT void (*GetFree()) (void *p);
00061 extern RAK_DLL_EXPORT void * (*GetMalloc_Ex()) (size_t size, const char *file, unsigned int line);
00062 extern RAK_DLL_EXPORT void * (*GetRealloc_Ex()) (void *p, size_t size, const char *file, unsigned int line);
00063 extern RAK_DLL_EXPORT void (*GetFree_Ex()) (void *p, const char *file, unsigned int line);
00064 extern RAK_DLL_EXPORT void *(*GetDLMallocMMap())(size_t size);
00065 extern RAK_DLL_EXPORT void *(*GetDLMallocDirectMMap())(size_t size);
00066 extern RAK_DLL_EXPORT int (*GetDLMallocMUnmap())(void* ptr, size_t size);
00067
00068 namespace RakNet
00069 {
00070
00071 template <class Type>
00072 RAK_DLL_EXPORT Type* OP_NEW(const char *file, unsigned int line)
00073 {
00074 #if _USE_RAK_MEMORY_OVERRIDE==1
00075 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
00076 Type *t = new (buffer) Type;
00077 return t;
00078 #else
00079 (void) file;
00080 (void) line;
00081 return new Type;
00082 #endif
00083 }
00084
00085 template <class Type, class P1>
00086 RAK_DLL_EXPORT Type* OP_NEW_1(const char *file, unsigned int line, const P1 &p1)
00087 {
00088 #if _USE_RAK_MEMORY_OVERRIDE==1
00089 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
00090 Type *t = new (buffer) Type(p1);
00091 return t;
00092 #else
00093 (void) file;
00094 (void) line;
00095 return new Type(p1);
00096 #endif
00097 }
00098
00099 template <class Type, class P1, class P2>
00100 RAK_DLL_EXPORT Type* OP_NEW_2(const char *file, unsigned int line, const P1 &p1, const P2 &p2)
00101 {
00102 #if _USE_RAK_MEMORY_OVERRIDE==1
00103 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
00104 Type *t = new (buffer) Type(p1, p2);
00105 return t;
00106 #else
00107 (void) file;
00108 (void) line;
00109 return new Type(p1, p2);
00110 #endif
00111 }
00112
00113 template <class Type, class P1, class P2, class P3>
00114 RAK_DLL_EXPORT Type* OP_NEW_3(const char *file, unsigned int line, const P1 &p1, const P2 &p2, const P3 &p3)
00115 {
00116 #if _USE_RAK_MEMORY_OVERRIDE==1
00117 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
00118 Type *t = new (buffer) Type(p1, p2, p3);
00119 return t;
00120 #else
00121 (void) file;
00122 (void) line;
00123 return new Type(p1, p2, p3);
00124 #endif
00125 }
00126
00127 template <class Type, class P1, class P2, class P3, class P4>
00128 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)
00129 {
00130 #if _USE_RAK_MEMORY_OVERRIDE==1
00131 char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line);
00132 Type *t = new (buffer) Type(p1, p2, p3, p4);
00133 return t;
00134 #else
00135 (void) file;
00136 (void) line;
00137 return new Type(p1, p2, p3, p4);
00138 #endif
00139 }
00140
00141
00142 template <class Type>
00143 RAK_DLL_EXPORT Type* OP_NEW_ARRAY(const int count, const char *file, unsigned int line)
00144 {
00145 if (count==0)
00146 return 0;
00147
00148 #if _USE_RAK_MEMORY_OVERRIDE==1
00149
00150 char *buffer = (char *) (GetMalloc_Ex())(sizeof(int)+sizeof(Type)*count, file, line);
00151 ((int*)buffer)[0]=count;
00152 for (int i=0; i<count; i++)
00153 {
00154
00155 new(buffer+sizeof(int)+i*sizeof(Type)) Type;
00156 }
00157 return (Type *) (buffer+sizeof(int));
00158 #else
00159 (void) file;
00160 (void) line;
00161 return new Type[count];
00162 #endif
00163
00164 }
00165
00166 template <class Type>
00167 RAK_DLL_EXPORT void OP_DELETE(Type *buff, const char *file, unsigned int line)
00168 {
00169 #if _USE_RAK_MEMORY_OVERRIDE==1
00170 if (buff==0) return;
00171 buff->~Type();
00172 (GetFree_Ex())((char*)buff, file, line );
00173 #else
00174 (void) file;
00175 (void) line;
00176 delete buff;
00177 #endif
00178
00179 }
00180
00181 template <class Type>
00182 RAK_DLL_EXPORT void OP_DELETE_ARRAY(Type *buff, const char *file, unsigned int line)
00183 {
00184 #if _USE_RAK_MEMORY_OVERRIDE==1
00185 if (buff==0)
00186 return;
00187
00188 int count = ((int*)((char*)buff-sizeof(int)))[0];
00189 Type *t;
00190 for (int i=0; i<count; i++)
00191 {
00192 t = buff+i;
00193 t->~Type();
00194 }
00195 (GetFree_Ex())((char*)buff-sizeof(int), file, line );
00196 #else
00197 (void) file;
00198 (void) line;
00199 delete [] buff;
00200 #endif
00201
00202 }
00203
00204 void RAK_DLL_EXPORT * _RakMalloc (size_t size);
00205 void RAK_DLL_EXPORT * _RakRealloc (void *p, size_t size);
00206 void RAK_DLL_EXPORT _RakFree (void *p);
00207 void RAK_DLL_EXPORT * _RakMalloc_Ex (size_t size, const char *file, unsigned int line);
00208 void RAK_DLL_EXPORT * _RakRealloc_Ex (void *p, size_t size, const char *file, unsigned int line);
00209 void RAK_DLL_EXPORT _RakFree_Ex (void *p, const char *file, unsigned int line);
00210 void RAK_DLL_EXPORT * _DLMallocMMap (size_t size);
00211 void RAK_DLL_EXPORT * _DLMallocDirectMMap (size_t size);
00212 int RAK_DLL_EXPORT _DLMallocMUnmap (void *p, size_t size);
00213
00214 }
00215
00216
00217
00218
00219 void UseRaknetFixedHeap(size_t initialCapacity,
00220 void * (*yourMMapFunction) (size_t size) = RakNet::_DLMallocMMap,
00221 void * (*yourDirectMMapFunction) (size_t size) = RakNet::_DLMallocDirectMMap,
00222 int (*yourMUnmapFunction) (void *p, size_t size) = RakNet::_DLMallocMUnmap);
00223
00224
00225 void FreeRakNetFixedHeap(void);
00226
00227 #if _USE_RAK_MEMORY_OVERRIDE==1
00228 #if defined(RMO_NEW_UNDEF)
00229 #pragma pop_macro("new")
00230 #undef RMO_NEW_UNDEF
00231 #endif
00232 #endif
00233
00234 #endif