Home | History | Annotate | Download | only in fxcrt
      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