Files
mcpe/thirdparty/raknet/RakMemoryOverride.cpp
iProgramInCpp 9642818a88 * Initial commit.
:)
2023-07-30 22:22:02 +03:00

307 lines
7.2 KiB
C++

/*
* Copyright (c) 2014, Oculus VR, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
#include "RakMemoryOverride.h"
#include "RakAssert.h"
#include <stdlib.h>
#ifdef _RAKNET_SUPPORT_DL_MALLOC
#include "rdlmalloc.h"
#endif
using namespace RakNet;
#if _USE_RAK_MEMORY_OVERRIDE==1
#if defined(malloc)
#pragma push_macro("malloc")
#undef malloc
#define RMO_MALLOC_UNDEF
#endif
#if defined(realloc)
#pragma push_macro("realloc")
#undef realloc
#define RMO_REALLOC_UNDEF
#endif
#if defined(free)
#pragma push_macro("free")
#undef free
#define RMO_FREE_UNDEF
#endif
#endif
void DefaultOutOfMemoryHandler(const char *file, const long line)
{
(void) file;
(void) line;
RakAssert(0);
}
void * (*rakMalloc) (size_t size) = RakNet::_RakMalloc;
void* (*rakRealloc) (void *p, size_t size) = RakNet::_RakRealloc;
void (*rakFree) (void *p) = RakNet::_RakFree;
void* (*rakMalloc_Ex) (size_t size, const char *file, unsigned int line) = RakNet::_RakMalloc_Ex;
void* (*rakRealloc_Ex) (void *p, size_t size, const char *file, unsigned int line) = RakNet::_RakRealloc_Ex;
void (*rakFree_Ex) (void *p, const char *file, unsigned int line) = RakNet::_RakFree_Ex;
void (*notifyOutOfMemory) (const char *file, const long line)=DefaultOutOfMemoryHandler;
void * (*dlMallocMMap) (size_t size) = RakNet::_DLMallocMMap;
void * (*dlMallocDirectMMap) (size_t size) = RakNet::_DLMallocDirectMMap;
int (*dlMallocMUnmap) (void* ptr, size_t size) = RakNet::_DLMallocMUnmap;
void SetMalloc( void* (*userFunction)(size_t size) )
{
rakMalloc=userFunction;
}
void SetRealloc( void* (*userFunction)(void *p, size_t size) )
{
rakRealloc=userFunction;
}
void SetFree( void (*userFunction)(void *p) )
{
rakFree=userFunction;
}
void SetMalloc_Ex( void* (*userFunction)(size_t size, const char *file, unsigned int line) )
{
rakMalloc_Ex=userFunction;
}
void SetRealloc_Ex( void* (*userFunction)(void *p, size_t size, const char *file, unsigned int line) )
{
rakRealloc_Ex=userFunction;
}
void SetFree_Ex( void (*userFunction)(void *p, const char *file, unsigned int line) )
{
rakFree_Ex=userFunction;
}
void SetNotifyOutOfMemory( void (*userFunction)(const char *file, const long line) )
{
notifyOutOfMemory=userFunction;
}
void SetDLMallocMMap( void* (*userFunction)(size_t size) )
{
dlMallocMMap=userFunction;
}
void SetDLMallocDirectMMap( void* (*userFunction)(size_t size) )
{
dlMallocDirectMMap=userFunction;
}
void SetDLMallocMUnmap( int (*userFunction)(void* ptr, size_t size) )
{
dlMallocMUnmap=userFunction;
}
void * (*GetMalloc()) (size_t size)
{
return rakMalloc;
}
void * (*GetRealloc()) (void *p, size_t size)
{
return rakRealloc;
}
void (*GetFree()) (void *p)
{
return rakFree;
}
void * (*GetMalloc_Ex()) (size_t size, const char *file, unsigned int line)
{
return rakMalloc_Ex;
}
void * (*GetRealloc_Ex()) (void *p, size_t size, const char *file, unsigned int line)
{
return rakRealloc_Ex;
}
void (*GetFree_Ex()) (void *p, const char *file, unsigned int line)
{
return rakFree_Ex;
}
void *(*GetDLMallocMMap())(size_t size)
{
return dlMallocMMap;
}
void *(*GetDLMallocDirectMMap())(size_t size)
{
return dlMallocDirectMMap;
}
int (*GetDLMallocMUnmap())(void* ptr, size_t size)
{
return dlMallocMUnmap;
}
void* RakNet::_RakMalloc (size_t size)
{
return malloc(size);
}
void* RakNet::_RakRealloc (void *p, size_t size)
{
return realloc(p,size);
}
void RakNet::_RakFree (void *p)
{
free(p);
}
void* RakNet::_RakMalloc_Ex (size_t size, const char *file, unsigned int line)
{
(void) file;
(void) line;
return malloc(size);
}
void* RakNet::_RakRealloc_Ex (void *p, size_t size, const char *file, unsigned int line)
{
(void) file;
(void) line;
return realloc(p,size);
}
void RakNet::_RakFree_Ex (void *p, const char *file, unsigned int line)
{
(void) file;
(void) line;
free(p);
}
#ifdef _RAKNET_SUPPORT_DL_MALLOC
void * RakNet::_DLMallocMMap (size_t size)
{
return RAK_MMAP_DEFAULT(size);
}
void * RakNet::_DLMallocDirectMMap (size_t size)
{
return RAK_DIRECT_MMAP_DEFAULT(size);
}
int RakNet::_DLMallocMUnmap (void *p, size_t size)
{
return RAK_MUNMAP_DEFAULT(p,size);
}
static mspace rakNetFixedHeapMSpace=0;
void* _DLMalloc(size_t size)
{
return rak_mspace_malloc(rakNetFixedHeapMSpace,size);
}
void* _DLRealloc(void *p, size_t size)
{
return rak_mspace_realloc(rakNetFixedHeapMSpace,p,size);
}
void _DLFree(void *p)
{
if (p)
rak_mspace_free(rakNetFixedHeapMSpace,p);
}
void* _DLMalloc_Ex (size_t size, const char *file, unsigned int line)
{
(void) file;
(void) line;
return rak_mspace_malloc(rakNetFixedHeapMSpace,size);
}
void* _DLRealloc_Ex (void *p, size_t size, const char *file, unsigned int line)
{
(void) file;
(void) line;
return rak_mspace_realloc(rakNetFixedHeapMSpace,p,size);
}
void _DLFree_Ex (void *p, const char *file, unsigned int line)
{
(void) file;
(void) line;
if (p)
rak_mspace_free(rakNetFixedHeapMSpace,p);
}
void UseRaknetFixedHeap(size_t initialCapacity,
void * (*yourMMapFunction) (size_t size),
void * (*yourDirectMMapFunction) (size_t size),
int (*yourMUnmapFunction) (void *p, size_t size))
{
SetDLMallocMMap(yourMMapFunction);
SetDLMallocDirectMMap(yourDirectMMapFunction);
SetDLMallocMUnmap(yourMUnmapFunction);
SetMalloc(_DLMalloc);
SetRealloc(_DLRealloc);
SetFree(_DLFree);
SetMalloc_Ex(_DLMalloc_Ex);
SetRealloc_Ex(_DLRealloc_Ex);
SetFree_Ex(_DLFree_Ex);
rakNetFixedHeapMSpace=rak_create_mspace(initialCapacity, 0);
}
void FreeRakNetFixedHeap(void)
{
if (rakNetFixedHeapMSpace)
{
rak_destroy_mspace(rakNetFixedHeapMSpace);
rakNetFixedHeapMSpace=0;
}
SetMalloc(_RakMalloc);
SetRealloc(_RakRealloc);
SetFree(_RakFree);
SetMalloc_Ex(_RakMalloc_Ex);
SetRealloc_Ex(_RakRealloc_Ex);
SetFree_Ex(_RakFree_Ex);
}
#else
void * RakNet::_DLMallocMMap (size_t size) {(void) size; return 0;}
void * RakNet::_DLMallocDirectMMap (size_t size) {(void) size; return 0;}
int RakNet::_DLMallocMUnmap (void *p, size_t size) {(void) size; (void) p; return 0;}
void* _DLMalloc(size_t size) {(void) size; return 0;}
void* _DLRealloc(void *p, size_t size) {(void) p; (void) size; return 0;}
void _DLFree(void *p) {(void) p;}
void* _DLMalloc_Ex (size_t size, const char *file, unsigned int line) {(void) size; (void) file; (void) line; return 0;}
void* _DLRealloc_Ex (void *p, size_t size, const char *file, unsigned int line) {(void) p; (void) size; (void) file; (void) line; return 0;}
void _DLFree_Ex (void *p, const char *file, unsigned int line) {(void) p; (void) file; (void) line;}
void UseRaknetFixedHeap(size_t initialCapacity,
void * (*yourMMapFunction) (size_t size),
void * (*yourDirectMMapFunction) (size_t size),
int (*yourMUnmapFunction) (void *p, size_t size))
{
(void) initialCapacity;
(void) yourMMapFunction;
(void) yourDirectMMapFunction;
(void) yourMUnmapFunction;
}
void FreeRakNetFixedHeap(void) {}
#endif
#if _USE_RAK_MEMORY_OVERRIDE==1
#if defined(RMO_MALLOC_UNDEF)
#pragma pop_macro("malloc")
#undef RMO_MALLOC_UNDEF
#endif
#if defined(RMO_REALLOC_UNDEF)
#pragma pop_macro("realloc")
#undef RMO_REALLOC_UNDEF
#endif
#if defined(RMO_FREE_UNDEF)
#pragma pop_macro("free")
#undef RMO_FREE_UNDEF
#endif
#endif