Clean up CPDF_AnnotList.
[pdfium.git] / core / src / fxcrt / fx_basic_memmgr.cpp
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   return (void*)malloc(byte_size);
12 }
13 void* FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags) {
14   return realloc(pointer, new_size);
15 }
16 void FXMEM_DefaultFree(void* pointer, int flags) {
17   free(pointer);
18 }
19
20 NEVER_INLINE void FX_OutOfMemoryTerminate() {
21   // Termimate cleanly if we can, else crash at a specific address (0xbd).
22   abort();
23   reinterpret_cast<void (*)()>(0xbd)();
24 }
25
26 CFX_GrowOnlyPool::CFX_GrowOnlyPool(size_t trunk_size) {
27   m_TrunkSize = trunk_size;
28   m_pFirstTrunk = NULL;
29 }
30 CFX_GrowOnlyPool::~CFX_GrowOnlyPool() {
31   FreeAll();
32 }
33 struct _FX_GrowOnlyTrunk {
34   size_t m_Size;
35   size_t m_Allocated;
36   _FX_GrowOnlyTrunk* m_pNext;
37 };
38 void CFX_GrowOnlyPool::FreeAll() {
39   _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
40   while (pTrunk) {
41     _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext;
42     FX_Free(pTrunk);
43     pTrunk = pNext;
44   }
45   m_pFirstTrunk = NULL;
46 }
47 void* CFX_GrowOnlyPool::Alloc(size_t size) {
48   size = (size + 3) / 4 * 4;
49   _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
50   while (pTrunk) {
51     if (pTrunk->m_Size - pTrunk->m_Allocated >= size) {
52       void* p = (uint8_t*)(pTrunk + 1) + pTrunk->m_Allocated;
53       pTrunk->m_Allocated += size;
54       return p;
55     }
56     pTrunk = pTrunk->m_pNext;
57   }
58   size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize;
59   pTrunk = (_FX_GrowOnlyTrunk*)FX_Alloc(uint8_t,
60                                         sizeof(_FX_GrowOnlyTrunk) + alloc_size);
61   pTrunk->m_Size = alloc_size;
62   pTrunk->m_Allocated = size;
63   pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
64   m_pFirstTrunk = pTrunk;
65   return pTrunk + 1;
66 }