• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

RakMemoryOverride.h

Go to the documentation of this file.
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 // These pointers are statically and globally defined in RakMemoryOverride.cpp
00032 // Change them to point to your own allocators if you want.
00033 // Use the functions for a DLL, or just reassign the variable if using source
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 // Change to a user defined allocation function
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 // Change to a user defined out of memory function
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 //              Type *t;
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                         //t = 
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 // Call to make RakNet allocate a large block of memory, and do all subsequent allocations in that memory block
00217 // Initial and reallocations will be done through whatever function is pointed to by yourMMapFunction, and yourDirectMMapFunction (default is malloc)
00218 // Allocations will be freed through whatever function is pointed to by yourMUnmapFunction (default free)
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 // Free memory allocated from UseRaknetFixedHeap
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

Generated on Thu Sep 30 2010 01:27:26 for RakNet by  doxygen 1.7.1