Shadowrun: Awakened 29 September 2011 - Build 871
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 
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.

GNU Lesser General Public License 3 Sourceforge.net