diff options
-rw-r--r-- | core/include/fxcrt/fx_memory.h | 46 | ||||
-rw-r--r-- | core/src/fxcrt/fx_basic_memmgr.cpp | 55 |
2 files changed, 94 insertions, 7 deletions
diff --git a/core/include/fxcrt/fx_memory.h b/core/include/fxcrt/fx_memory.h index 8806bba7dd..cb71c04fca 100644 --- a/core/include/fxcrt/fx_memory.h +++ b/core/include/fxcrt/fx_memory.h @@ -65,9 +65,12 @@ public: } void operator delete (void*, void*) {} }; +#endif +#ifdef __cplusplus #if defined(_DEBUG) #define FX_NEW new(__FILE__, __LINE__) #else + #define FX_NEW new #endif #define FX_NEW_VECTOR(Pointer, Class, Count) \ @@ -88,5 +91,44 @@ public: virtual ~CFX_DestructObject() {} }; -#endif // __cplusplus -#endif // _FX_MEMORY_H_ +class CFX_GrowOnlyPool : public CFX_Object +{ +public: + + CFX_GrowOnlyPool(size_t trunk_size = 16384); + + ~CFX_GrowOnlyPool(); + + void SetTrunkSize(size_t trunk_size) + { + m_TrunkSize = trunk_size; + } + + void* AllocDebug(size_t size, FX_LPCSTR file, int line) + { + return Alloc(size); + } + + void* Alloc(size_t size); + + void* ReallocDebug(void* p, size_t new_size, FX_LPCSTR file, int line) + { + return NULL; + } + + void* Realloc(void* p, size_t new_size) + { + return NULL; + } + + void Free(void*) {} + + void FreeAll(); +private: + + size_t m_TrunkSize; + + void* m_pFirstTrunk; +}; +#endif +#endif 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; +} |