 |
DDNet documentation
|
Loading...
Searching...
No Matches
Go to the documentation of this file.
13#define __has_feature(x) 0
15#if __has_feature(address_sanitizer)
16#include <sanitizer/asan_interface.h>
18#define ASAN_POISON_MEMORY_REGION(addr, size) \
19 ((void)(addr), (void)(size))
20#define ASAN_UNPOISON_MEMORY_REGION(addr, size) \
21 ((void)(addr), (void)(size))
24#define MACRO_ALLOC_HEAP() \
26 void *operator new(size_t Size) \
28 void *pObj = malloc(Size); \
29 mem_zero(pObj, Size); \
32 void operator delete(void *pPtr) \
39#define MACRO_ALLOC_POOL_ID() \
41 void *operator new(size_t Size, int Id); \
42 void operator delete(void *pObj, int Id); \
43 void operator delete(void *pObj); \
47#if __has_feature(address_sanitizer)
48#define MACRO_ALLOC_GET_SIZE(POOLTYPE) ((sizeof(POOLTYPE) + 7) & ~7)
50#define MACRO_ALLOC_GET_SIZE(POOLTYPE) (sizeof(POOLTYPE))
53#define MACRO_ALLOC_POOL_ID_IMPL(POOLTYPE, PoolSize) \
54 static char gs_PoolData##POOLTYPE[PoolSize][MACRO_ALLOC_GET_SIZE(POOLTYPE)] = {{0}}; \
55 static int gs_PoolUsed##POOLTYPE[PoolSize] = {0}; \
56 [[maybe_unused]] static int gs_PoolDummy##POOLTYPE = (ASAN_POISON_MEMORY_REGION(gs_PoolData##POOLTYPE, sizeof(gs_PoolData##POOLTYPE)), 0); \
57 void *POOLTYPE::operator new(size_t Size, int Id) \
59 dbg_assert(sizeof(POOLTYPE) >= Size, "size error"); \
60 dbg_assert(!gs_PoolUsed##POOLTYPE[Id], "already used"); \
61 ASAN_UNPOISON_MEMORY_REGION(gs_PoolData##POOLTYPE[Id], sizeof(gs_PoolData##POOLTYPE[Id])); \
62 gs_PoolUsed##POOLTYPE[Id] = 1; \
63 mem_zero(gs_PoolData##POOLTYPE[Id], sizeof(gs_PoolData##POOLTYPE[Id])); \
64 return gs_PoolData##POOLTYPE[Id]; \
66 void POOLTYPE::operator delete(void *pObj, int Id) \
68 dbg_assert(gs_PoolUsed##POOLTYPE[Id], "not used"); \
69 dbg_assert(Id == (POOLTYPE *)pObj - (POOLTYPE *)gs_PoolData##POOLTYPE, "invalid id"); \
70 gs_PoolUsed##POOLTYPE[Id] = 0; \
71 mem_zero(gs_PoolData##POOLTYPE[Id], sizeof(gs_PoolData##POOLTYPE[Id])); \
72 ASAN_POISON_MEMORY_REGION(gs_PoolData##POOLTYPE[Id], sizeof(gs_PoolData##POOLTYPE[Id])); \
74 void POOLTYPE::operator delete(void *pObj) \
76 int Id = (POOLTYPE *)pObj - (POOLTYPE *)gs_PoolData##POOLTYPE; \
77 dbg_assert(gs_PoolUsed##POOLTYPE[Id], "not used"); \
78 gs_PoolUsed##POOLTYPE[Id] = 0; \
79 mem_zero(gs_PoolData##POOLTYPE[Id], sizeof(gs_PoolData##POOLTYPE[Id])); \
80 ASAN_POISON_MEMORY_REGION(gs_PoolData##POOLTYPE[Id], sizeof(gs_PoolData##POOLTYPE[Id])); \