diff options
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/fxcrt/fx_basic_memmgr.cpp | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/core/src/fxcrt/fx_basic_memmgr.cpp b/core/src/fxcrt/fx_basic_memmgr.cpp index 6538ea6a70..3b3211c20f 100644 --- a/core/src/fxcrt/fx_basic_memmgr.cpp +++ b/core/src/fxcrt/fx_basic_memmgr.cpp @@ -5,12 +5,12 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "../../include/fxcrt/fx_basic.h" - +#ifdef __cplusplus extern "C" { - +#endif void* FXMEM_DefaultAlloc(size_t byte_size, int flags) { - return malloc(byte_size); + return (void*)malloc(byte_size); } void* FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags) { @@ -20,5 +20,50 @@ void FXMEM_DefaultFree(void* pointer, int flags) { free(pointer); } - -} // extern "C" +#ifdef __cplusplus +} +#endif +CFX_GrowOnlyPool::CFX_GrowOnlyPool(size_t trunk_size) +{ + m_TrunkSize = trunk_size; + m_pFirstTrunk = NULL; +} +CFX_GrowOnlyPool::~CFX_GrowOnlyPool() +{ + FreeAll(); +} +struct _FX_GrowOnlyTrunk { + size_t m_Size; + size_t m_Allocated; + _FX_GrowOnlyTrunk* m_pNext; +}; +void CFX_GrowOnlyPool::FreeAll() +{ + _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; + while (pTrunk) { + _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext; + FX_Free(pTrunk); + pTrunk = pNext; + } + m_pFirstTrunk = NULL; +} +void* CFX_GrowOnlyPool::Alloc(size_t size) +{ + size = (size + 3) / 4 * 4; + _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; + while (pTrunk) { + if (pTrunk->m_Size - pTrunk->m_Allocated >= size) { + void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated; + pTrunk->m_Allocated += size; + return p; + } + pTrunk = pTrunk->m_pNext; + } + size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize; + pTrunk = (_FX_GrowOnlyTrunk*)FX_Alloc(FX_BYTE, sizeof(_FX_GrowOnlyTrunk) + alloc_size); + pTrunk->m_Size = alloc_size; + pTrunk->m_Allocated = size; + pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; + m_pFirstTrunk = pTrunk; + return pTrunk + 1; +} |