| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "../../include/fxcrt/fx_basic.h" | 7 #include "../../include/fxcrt/fx_basic.h" |
| 8 #include "mem_int.h" | |
| 9 void FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr) | |
| 10 { | |
| 11 if (pFoxitMgr == NULL) { | |
| 12 return; | |
| 13 } | |
| 14 CFX_MemoryMgr* p = (CFX_MemoryMgr*)pFoxitMgr; | |
| 15 if (p->m_pSystemMgr->CollectAll) { | |
| 16 p->m_pSystemMgr->CollectAll(p->m_pSystemMgr); | |
| 17 } | |
| 18 if (p->m_bReleaseMgr) { | |
| 19 p->m_pSystemMgr->Free(p->m_pSystemMgr, p, 0); | |
| 20 } | |
| 21 if (p->m_pExternalMemory) { | |
| 22 free(p->m_pExternalMemory); | |
| 23 } | |
| 24 } | |
| 25 #ifdef __cplusplus | 8 #ifdef __cplusplus |
| 26 extern "C" { | 9 extern "C" { |
| 27 #endif | 10 #endif |
| 28 static void* _DefAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCSTR fi
lename, int line) | 11 void*» FXMEM_DefaultAlloc(size_t byte_size, int flags) |
| 29 { | 12 { |
| 30 return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->AllocDebug(size, 0, file
name, line); | 13 return (void*)malloc(byte_size); |
| 31 } | 14 } |
| 32 static void* _DefAlloc(IFX_Allocator* pAllocator, size_t size) | 15 void*» FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags) |
| 33 { | 16 { |
| 34 return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Alloc(size, 0); | 17 return realloc(pointer, new_size); |
| 35 } | 18 } |
| 36 static void* _DefReallocDebug(IFX_Allocator* pAllocator, void* p, size_t size, F
X_LPCSTR filename, int line) | 19 void» FXMEM_DefaultFree(void* pointer, int flags) |
| 37 { | 20 { |
| 38 return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->ReallocDebug(p, size, 0,
filename, line); | 21 free(pointer); |
| 39 } | |
| 40 static void* _DefRealloc(IFX_Allocator* pAllocator, void* p, size_t size) | |
| 41 { | |
| 42 return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Realloc(p, size, 0); | |
| 43 } | |
| 44 static void _DefFree(IFX_Allocator* pAllocator, void* p) | |
| 45 { | |
| 46 ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Free(p, 0); | |
| 47 } | 22 } |
| 48 #ifdef __cplusplus | 23 #ifdef __cplusplus |
| 49 } | 24 } |
| 50 #endif | 25 #endif |
| 51 void CFX_MemoryMgr::Init(FXMEM_SystemMgr* pSystemMgr) | 26 CFX_GrowOnlyPool::CFX_GrowOnlyPool(size_t trunk_size) |
| 52 { | |
| 53 m_pSystemMgr = pSystemMgr; | |
| 54 IFX_Allocator &ac = m_DefAllocator.m_Allocator; | |
| 55 ac.m_Alloc = _DefAlloc; | |
| 56 ac.m_AllocDebug = _DefAllocDebug; | |
| 57 ac.m_Realloc = _DefRealloc; | |
| 58 ac.m_ReallocDebug = _DefReallocDebug; | |
| 59 ac.m_Free = _DefFree; | |
| 60 m_DefAllocator.m_pFoxitMgr = this; | |
| 61 m_pExternalMemory = NULL; | |
| 62 m_bReleaseMgr = TRUE; | |
| 63 } | |
| 64 void CFX_MemoryMgr::PurgeMgr() | |
| 65 { | |
| 66 if (m_pSystemMgr->Purge) { | |
| 67 m_pSystemMgr->Purge(m_pSystemMgr); | |
| 68 } | |
| 69 } | |
| 70 void* CFX_MemoryMgr::Alloc(size_t size, int flags) | |
| 71 { | |
| 72 void* p = m_pSystemMgr->Alloc(m_pSystemMgr, size, flags); | |
| 73 if (p == NULL) { | |
| 74 return NULL; | |
| 75 } | |
| 76 return p; | |
| 77 } | |
| 78 void* CFX_MemoryMgr::AllocDebug(size_t size, int flags, FX_LPCSTR file, int line
) | |
| 79 { | |
| 80 void* p = m_pSystemMgr->AllocDebug(m_pSystemMgr, size, flags, file, line); | |
| 81 if (p == NULL) { | |
| 82 return NULL; | |
| 83 } | |
| 84 return p; | |
| 85 } | |
| 86 void* CFX_MemoryMgr::Realloc(void* p, size_t size, int flags) | |
| 87 { | |
| 88 void* p1 = m_pSystemMgr->Realloc(m_pSystemMgr, p, size, flags); | |
| 89 if (p1 == NULL) { | |
| 90 return NULL; | |
| 91 } | |
| 92 return p1; | |
| 93 } | |
| 94 void* CFX_MemoryMgr::ReallocDebug(void* p, size_t size, int flags, FX_LPCSTR fil
e, int line) | |
| 95 { | |
| 96 void* p1 = m_pSystemMgr->ReallocDebug(m_pSystemMgr, p, size, flags, file, li
ne); | |
| 97 if (p1 == NULL) { | |
| 98 return NULL; | |
| 99 } | |
| 100 return p1; | |
| 101 } | |
| 102 void CFX_MemoryMgr::Free(void* p, int flags) | |
| 103 { | |
| 104 if (p == NULL) { | |
| 105 return; | |
| 106 } | |
| 107 m_pSystemMgr->Free(m_pSystemMgr, p, flags); | |
| 108 } | |
| 109 CFX_MemoryMgr* g_pDefFoxitMgr = NULL; | |
| 110 void* FXMEM_DefaultAlloc(size_t size, int flags) | |
| 111 { | |
| 112 return g_pDefFoxitMgr->Alloc(size, flags); | |
| 113 } | |
| 114 void* FXMEM_DefaultAlloc2(size_t size, size_t unit, int flags) | |
| 115 { | |
| 116 return g_pDefFoxitMgr->Alloc(size * unit, flags); | |
| 117 } | |
| 118 void* FXMEM_DefaultRealloc(void* p, size_t size, int flags) | |
| 119 { | |
| 120 if (p == NULL) { | |
| 121 return FXMEM_DefaultAlloc(size, flags); | |
| 122 } | |
| 123 return g_pDefFoxitMgr->Realloc(p, size, flags); | |
| 124 } | |
| 125 void* FXMEM_DefaultRealloc2(void* p, size_t size, size_t unit, int flags) | |
| 126 { | |
| 127 if (p == NULL) { | |
| 128 return FXMEM_DefaultAlloc2(size, unit, flags); | |
| 129 } | |
| 130 return g_pDefFoxitMgr->Realloc(p, size * unit, flags); | |
| 131 } | |
| 132 void* FXMEM_DefaultAllocDebug(size_t size, int flags, FX_LPCSTR file, int line) | |
| 133 { | |
| 134 return g_pDefFoxitMgr->AllocDebug(size, flags, file, line); | |
| 135 } | |
| 136 void* FXMEM_DefaultAllocDebug2(size_t size, size_t unit, int flags, FX_LPCSTR fi
le, int line) | |
| 137 { | |
| 138 return g_pDefFoxitMgr->AllocDebug(size * unit, flags, file, line); | |
| 139 } | |
| 140 void* FXMEM_DefaultReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file,
int line) | |
| 141 { | |
| 142 if (p == NULL) { | |
| 143 return FXMEM_DefaultAllocDebug(size, flags, file, line); | |
| 144 } | |
| 145 return g_pDefFoxitMgr->ReallocDebug(p, size, flags, file, line); | |
| 146 } | |
| 147 void* FXMEM_DefaultReallocDebug2(void* p, size_t size, size_t unit, int flags, F
X_LPCSTR file, int line) | |
| 148 { | |
| 149 if (p == NULL) { | |
| 150 return FXMEM_DefaultAllocDebug2(size, unit, flags, file, line); | |
| 151 } | |
| 152 return g_pDefFoxitMgr->ReallocDebug(p, size * unit, flags, file, line); | |
| 153 } | |
| 154 void FXMEM_DefaultFree(void* p, int flags) | |
| 155 { | |
| 156 g_pDefFoxitMgr->Free(p, flags); | |
| 157 } | |
| 158 IFX_Allocator* FXMEM_GetDefAllocator() | |
| 159 { | |
| 160 return &g_pDefFoxitMgr->m_DefAllocator.m_Allocator; | |
| 161 } | |
| 162 void* CFX_Object::operator new(size_t size) | |
| 163 { | |
| 164 return g_pDefFoxitMgr->Alloc(size, 0); | |
| 165 } | |
| 166 void* CFX_Object::operator new[](size_t size) | |
| 167 { | |
| 168 return g_pDefFoxitMgr->Alloc(size, 0); | |
| 169 } | |
| 170 void* CFX_Object::operator new[](size_t size, FX_LPCSTR file, int line) | |
| 171 { | |
| 172 return g_pDefFoxitMgr->AllocDebug(size, 0, file, line); | |
| 173 } | |
| 174 void* CFX_Object::operator new(size_t size, FX_LPCSTR file, int line) | |
| 175 { | |
| 176 return g_pDefFoxitMgr->AllocDebug(size, 0, file, line); | |
| 177 } | |
| 178 void CFX_Object::operator delete(void* p) | |
| 179 { | |
| 180 g_pDefFoxitMgr->Free(p, 0); | |
| 181 } | |
| 182 void CFX_Object::operator delete[](void* p) | |
| 183 { | |
| 184 g_pDefFoxitMgr->Free(p, 0); | |
| 185 } | |
| 186 void CFX_Object::operator delete(void* p, FX_LPCSTR file, int line) | |
| 187 { | |
| 188 g_pDefFoxitMgr->Free(p, 0); | |
| 189 } | |
| 190 void CFX_Object::operator delete[](void* p, FX_LPCSTR file, int line) | |
| 191 { | |
| 192 g_pDefFoxitMgr->Free(p, 0); | |
| 193 } | |
| 194 void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator, FX_L
PCSTR filename, int line) | |
| 195 { | |
| 196 void* p = pAllocator ? pAllocator->m_AllocDebug(pAllocator, size, filename,
line) : | |
| 197 g_pDefFoxitMgr->AllocDebug(size, 0, filename, line); | |
| 198 ((CFX_AllocObject*)p)->m_pAllocator = pAllocator; | |
| 199 return p; | |
| 200 } | |
| 201 void CFX_AllocObject::operator delete (void* p, IFX_Allocator* pAllocator, FX_LP
CSTR filename, int line) | |
| 202 { | |
| 203 if (pAllocator) { | |
| 204 pAllocator->m_Free(pAllocator, p); | |
| 205 } else { | |
| 206 g_pDefFoxitMgr->Free(p, 0); | |
| 207 } | |
| 208 } | |
| 209 void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator) | |
| 210 { | |
| 211 void* p = pAllocator ? pAllocator->m_Alloc(pAllocator, size) : g_pDefFoxitMg
r->Alloc(size, 0); | |
| 212 ((CFX_AllocObject*)p)->m_pAllocator = pAllocator; | |
| 213 return p; | |
| 214 } | |
| 215 void CFX_AllocObject::operator delete(void* p) | |
| 216 { | |
| 217 if (((CFX_AllocObject*)p)->m_pAllocator) { | |
| 218 (((CFX_AllocObject*)p)->m_pAllocator)->m_Free(((CFX_AllocObject*)p)->m_p
Allocator, p); | |
| 219 } else { | |
| 220 g_pDefFoxitMgr->Free(p, 0); | |
| 221 } | |
| 222 } | |
| 223 void CFX_AllocObject::operator delete(void* p, IFX_Allocator* pAllocator) | |
| 224 { | |
| 225 if (pAllocator) { | |
| 226 pAllocator->m_Free(pAllocator, p); | |
| 227 } else { | |
| 228 g_pDefFoxitMgr->Free(p, 0); | |
| 229 } | |
| 230 } | |
| 231 extern "C" { | |
| 232 static void* _GOPAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCST
R file, int line) | |
| 233 { | |
| 234 return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size); | |
| 235 } | |
| 236 static void* _GOPAlloc(IFX_Allocator* pAllocator, size_t size) | |
| 237 { | |
| 238 return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size); | |
| 239 } | |
| 240 static void* _GOPReallocDebug(IFX_Allocator* pAllocator, void* p, size_t new
_size, FX_LPCSTR file, int line) | |
| 241 { | |
| 242 return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size); | |
| 243 } | |
| 244 static void* _GOPRealloc(IFX_Allocator* pAllocator, void* p, size_t new_size
) | |
| 245 { | |
| 246 return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size); | |
| 247 } | |
| 248 static void _GOPFree(IFX_Allocator* pAllocator, void* p) | |
| 249 { | |
| 250 } | |
| 251 }; | |
| 252 CFX_GrowOnlyPool::CFX_GrowOnlyPool(IFX_Allocator* pAllocator, size_t trunk_size) | |
| 253 { | 27 { |
| 254 m_TrunkSize = trunk_size; | 28 m_TrunkSize = trunk_size; |
| 255 m_pFirstTrunk = NULL; | 29 m_pFirstTrunk = NULL; |
| 256 m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_A
llocator; | |
| 257 m_AllocDebug = _GOPAllocDebug; | |
| 258 m_Alloc = _GOPAlloc; | |
| 259 m_ReallocDebug = _GOPReallocDebug; | |
| 260 m_Realloc = _GOPRealloc; | |
| 261 m_Free = _GOPFree; | |
| 262 } | 30 } |
| 263 CFX_GrowOnlyPool::~CFX_GrowOnlyPool() | 31 CFX_GrowOnlyPool::~CFX_GrowOnlyPool() |
| 264 { | 32 { |
| 265 FreeAll(); | 33 FreeAll(); |
| 266 } | 34 } |
| 267 void CFX_GrowOnlyPool::SetAllocator(IFX_Allocator* pAllocator) | |
| 268 { | |
| 269 ASSERT(m_pFirstTrunk == NULL); | |
| 270 m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_A
llocator; | |
| 271 } | |
| 272 struct _FX_GrowOnlyTrunk { | 35 struct _FX_GrowOnlyTrunk { |
| 273 size_t m_Size; | 36 size_t m_Size; |
| 274 size_t m_Allocated; | 37 size_t m_Allocated; |
| 275 _FX_GrowOnlyTrunk* m_pNext; | 38 _FX_GrowOnlyTrunk* m_pNext; |
| 276 }; | 39 }; |
| 277 void CFX_GrowOnlyPool::FreeAll() | 40 void CFX_GrowOnlyPool::FreeAll() |
| 278 { | 41 { |
| 279 _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; | 42 _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; |
| 280 while (pTrunk) { | 43 while (pTrunk) { |
| 281 _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext; | 44 _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext; |
| 282 m_pAllocator->m_Free(m_pAllocator, pTrunk); | 45 FX_Free(pTrunk); |
| 283 pTrunk = pNext; | 46 pTrunk = pNext; |
| 284 } | 47 } |
| 285 m_pFirstTrunk = NULL; | 48 m_pFirstTrunk = NULL; |
| 286 } | 49 } |
| 287 void* CFX_GrowOnlyPool::Alloc(size_t size) | 50 void* CFX_GrowOnlyPool::Alloc(size_t size) |
| 288 { | 51 { |
| 289 size = (size + 3) / 4 * 4; | 52 size = (size + 3) / 4 * 4; |
| 290 _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; | 53 _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; |
| 291 while (pTrunk) { | 54 while (pTrunk) { |
| 292 if (pTrunk->m_Size - pTrunk->m_Allocated >= size) { | 55 if (pTrunk->m_Size - pTrunk->m_Allocated >= size) { |
| 293 void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated; | 56 void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated; |
| 294 pTrunk->m_Allocated += size; | 57 pTrunk->m_Allocated += size; |
| 295 return p; | 58 return p; |
| 296 } | 59 } |
| 297 pTrunk = pTrunk->m_pNext; | 60 pTrunk = pTrunk->m_pNext; |
| 298 } | 61 } |
| 299 size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize; | 62 size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize; |
| 300 pTrunk = (_FX_GrowOnlyTrunk*)m_pAllocator->m_Alloc(m_pAllocator, sizeof(_FX_
GrowOnlyTrunk) + alloc_size); | 63 pTrunk = (_FX_GrowOnlyTrunk*)FX_Alloc(FX_BYTE, sizeof(_FX_GrowOnlyTrunk) + a
lloc_size); |
| 301 pTrunk->m_Size = alloc_size; | 64 pTrunk->m_Size = alloc_size; |
| 302 pTrunk->m_Allocated = size; | 65 pTrunk->m_Allocated = size; |
| 303 pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; | 66 pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk; |
| 304 m_pFirstTrunk = pTrunk; | 67 m_pFirstTrunk = pTrunk; |
| 305 return pTrunk + 1; | 68 return pTrunk + 1; |
| 306 } | 69 } |
| OLD | NEW |