1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include <stdlib.h> // For abort(). 8 #include "../../include/fxcrt/fx_memory.h" 9 10 void* FXMEM_DefaultAlloc(size_t byte_size, int flags) 11 { 12 return (void*)malloc(byte_size); 13 } 14 void* FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags) 15 { 16 return realloc(pointer, new_size); 17 } 18 void FXMEM_DefaultFree(void* pointer, int flags) 19 { 20 free(pointer); 21 } 22 23 NEVER_INLINE void FX_OutOfMemoryTerminate() { 24 // Termimate cleanly if we can, else crash at a specific address (0xbd). 25 abort(); 26 reinterpret_cast<void(*)()>(0xbd)(); 27 } 28 29 CFX_GrowOnlyPool::CFX_GrowOnlyPool(size_t trunk_size) 30 { 31 m_TrunkSize = trunk_size; 32 m_pFirstTrunk = NULL; 33 } 34 CFX_GrowOnlyPool::~CFX_GrowOnlyPool() 35 { 36 FreeAll(); 37 } 38 struct _FX_GrowOnlyTrunk { 39 size_t m_Size; 40 size_t m_Allocated; 41 _FX_GrowOnlyTrunk* m_pNext; 42 }; 43 void CFX_GrowOnlyPool::FreeAll() 44 { 45 _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; 46 while (pTrunk) { 47 _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext; 48 FX_Free(pTrunk); 49 pTrunk = pNext; 50 } 51 m_pFirstTrunk = NULL; 52 } 53 void* CFX_GrowOnlyPool::Alloc(size_t size) 54 { 55 size = (size + 3) / 4 * 4; 56 _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; 57 while (pTrunk) { 58 if (pTrunk->m_Size - pTrunk->m_Allocated >= size) { 59 void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated; 60 pTrunk->m_Allocated += size; 61 return p; 62 } 63 pTrunk = pTrunk->m_pNext; 64 } 65 size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize; 66 pTrunk = (_FX_GrowOnlyTrunk*)FX_Alloc(FX_BYTE, sizeof(_FX_GrowOnlyTrunk) + alloc_size); 67 pTrunk->m_Size = alloc_size; 68 pTrunk->m_Allocated = size; 69 pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; 70 m_pFirstTrunk = pTrunk; 71 return pTrunk + 1; 72 } 73