fx_memory.h revision ee451cb395940862dad63c85adfe8f2fd55e864c
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file. 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FX_MEMORY_H_ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _FX_MEMORY_H_ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FX_SYSTEM_H_ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "fx_system.h" 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FXMEM_NONLEAVE 1 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FXMEM_MOVABLE 2 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FXMEM_DISCARDABLE 4 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" { 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct _FXMEM_SystemMgr { 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* (*Alloc)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags); 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* (*AllocDebug)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags, FX_LPCSTR file, int line); 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* (*Realloc)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags); 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* (*ReallocDebug)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags, FX_LPCSTR file, int line); 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* (*Lock)(struct _FXMEM_SystemMgr* pMgr, void* handle); 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void (*Unlock)(struct _FXMEM_SystemMgr* pMgr, void* handle); 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void (*Free)(struct _FXMEM_SystemMgr* pMgr, void* pointer, int flags); 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void (*Purge)(struct _FXMEM_SystemMgr* pMgr); 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void (*CollectAll)(struct _FXMEM_SystemMgr* pMgr); 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* user; 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} FXMEM_SystemMgr; 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DEFINEHANDLE(FXMEM_FoxitMgr) 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct _FXMEM_SystemMgr2 { 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL (*More)(struct _FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size); 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void (*Free)(struct _FXMEM_SystemMgr2* pMgr, void* memory); 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} FXMEM_SystemMgr2; 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible); 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr); 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* FXMEM_DefaultAlloc(size_t byte_size, int flags); 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* FXMEM_DefaultAlloc2(size_t units, size_t unit_size, int flags); 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags); 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* FXMEM_DefaultRealloc2(void* pointer, size_t units, size_t unit_size, int flags); 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid FXMEM_DefaultFree(void* pointer, int flags); 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_Alloc(type, size) (type*)FXMEM_DefaultAlloc2(size, sizeof(type), 0) 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_Realloc(type, ptr, size) (type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), 0) 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_AllocNL(type, size) (type*)FXMEM_DefaultAlloc2(size, sizeof(type), FXMEM_NONLEAVE) 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_ReallocNL(type, ptr, size) (type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), FXMEM_NONLEAVE) 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_Free(pointer) FXMEM_DefaultFree(pointer, 0) 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_DEBUG) 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_NEW new(__FILE__, __LINE__) 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_NEW new 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_Object 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new (size_t size, FX_LPCSTR file, int line); 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete (void* p, FX_LPCSTR file, int line); 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new (size_t size); 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete (void* p); 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new[] (size_t size, FX_LPCSTR file, int line); 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete[] (void* p, FX_LPCSTR file, int line); 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new[] (size_t size); 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete[] (void* p); 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new (size_t, void* buf) 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return buf; 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete (void*, void*) {} 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_NEW_VECTOR(Pointer, Class, Count) \ 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { \ 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Pointer = FX_Alloc(Class, Count); \ 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (Pointer) { \ 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < (Count); i ++) new (Pointer + i) Class; \ 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } \ 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_DELETE_VECTOR(Pointer, Class, Count) \ 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { \ 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < (Count); i ++) Pointer[i].~Class(); \ 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(Pointer); \ 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_DestructObject : public CFX_Object 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual ~CFX_DestructObject() {} 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" { 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct _IFX_Allocator { 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* (*m_AllocDebug)(struct _IFX_Allocator* pAllocator, size_t size, FX_LPCSTR file, int line); 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* (*m_Alloc)(struct _IFX_Allocator* pAllocator, size_t size); 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* (*m_ReallocDebug)(struct _IFX_Allocator* pAllocator, void* p, size_t size, FX_LPCSTR file, int line); 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* (*m_Realloc)(struct _IFX_Allocator* pAllocator, void* p, size_t size); 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void (*m_Free)(struct _IFX_Allocator* pAllocator, void* p); 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} IFX_Allocator; 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIFX_Allocator* FXMEM_GetDefAllocator(); 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef _DEBUG 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_Allocator_Alloc(fxAllocator, type, size) \ 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((fxAllocator) ? (type*)(fxAllocator)->m_AllocDebug((fxAllocator), (size) * sizeof(type), __FILE__, __LINE__) : (FX_Alloc(type, size))) 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \ 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((fxAllocator) ? (type*)(fxAllocator)->m_ReallocDebug((fxAllocator), (ptr), (new_size) * sizeof(type), __FILE__, __LINE__) : (FX_Realloc(type, ptr, new_size))) 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_Allocator_Alloc(fxAllocator, type, size) \ 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((fxAllocator) ? (type*)(fxAllocator)->m_Alloc((fxAllocator), (size) * sizeof(type)) : (FX_Alloc(type, size))) 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \ 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((fxAllocator) ? (type*)(fxAllocator)->m_Realloc((fxAllocator), (ptr), (new_size) * sizeof(type)) : (FX_Realloc(type, ptr, new_size))) 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_Allocator_Free(fxAllocator, ptr) \ 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ((fxAllocator) ? (fxAllocator)->m_Free((fxAllocator), (ptr)) : (FX_Free(ptr))) 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline void* operator new(size_t size, IFX_Allocator* fxAllocator) 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (void*)FX_Allocator_Alloc(fxAllocator, FX_BYTE, size); 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovinline void operator delete(void* ptr, IFX_Allocator* fxAllocator) 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_NewAtAllocator(fxAllocator) \ 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::new(fxAllocator) 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_DeleteAtAllocator(pointer, fxAllocator, __class__) \ 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (pointer)->~__class__(); \ 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Allocator_Free(fxAllocator, pointer) 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_AllocObject 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line); 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FX_NO_EXCEPTION_ 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line); 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new (size_t size, IFX_Allocator* pAllocator); 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete (void* p); 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FX_NO_EXCEPTION_ 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete (void* p, IFX_Allocator* pAllocator); 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new (size_t, void* buf) 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return buf; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FX_NO_EXCEPTION_ 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete (void*, void*) {} 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_Allocator* GetAllocator() const 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_pAllocator; 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate: 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new[] (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line) 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return operator new(size, pAllocator, file, line); 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FX_NO_EXCEPTION_ 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete[] (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line) {} 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new[] (size_t size, IFX_Allocator* pAllocator) 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return operator new(size, pAllocator); 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete[] (void* p) {} 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _FX_NO_EXCEPTION_ 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete[] (void* p, IFX_Allocator* pAllocator) {} 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected: 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_Allocator* m_pAllocator; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if defined(_DEBUG) 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_NEWAT(pAllocator) new(pAllocator, __FILE__, __LINE__) 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_NEWAT(pAllocator) new(pAllocator) 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CFX_GrowOnlyPool : public IFX_Allocator, public CFX_Object 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_GrowOnlyPool(IFX_Allocator* pAllocator = NULL, size_t trunk_size = 16384); 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ~CFX_GrowOnlyPool(); 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void SetAllocator(IFX_Allocator* pAllocator); 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void SetTrunkSize(size_t trunk_size) 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_TrunkSize = trunk_size; 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* AllocDebug(size_t size, FX_LPCSTR file, int line) 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return Alloc(size); 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* Alloc(size_t size); 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* ReallocDebug(void* p, size_t new_size, FX_LPCSTR file, int line) 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* Realloc(void* p, size_t new_size) 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Free(void*) {} 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void FreeAll(); 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate: 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t m_TrunkSize; 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* m_pFirstTrunk; 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IFX_Allocator* m_pAllocator; 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" { 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_FIXEDMEM_PAGESIZE (4096 * 16) 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FX_FIXEDMEM_MIDBLOCKSIZE (4096) 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef struct _FX_MEMCONFIG { 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageNum_Init8; 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageNum_Init16; 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageNum_Init32; 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageNum_More16; 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageNum_More32; 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageSize_Mid; 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageNum_InitMid; 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageNum_MoreMid; 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageSize_Large; 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size_t nPageSize_Alone; 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} FX_MEMCONFIG; 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid FXMEM_SetConfig(const FX_MEMCONFIG* memConfig); 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 301