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 #ifndef _FX_MEMORY_H_
8 #define _FX_MEMORY_H_
9 #ifndef _FX_SYSTEM_H_
10 #include "fx_system.h"
11 #endif
12 #define FXMEM_NONLEAVE 1
13 #define FXMEM_MOVABLE 2
14 #define FXMEM_DISCARDABLE 4
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 typedef struct _FXMEM_SystemMgr {
19
20 void* (*Alloc)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags);
21
22 void* (*AllocDebug)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags, FX_LPCSTR file, int line);
23
24 void* (*Realloc)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags);
25
26 void* (*ReallocDebug)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags, FX_LPCSTR file, int line);
27
28 void* (*Lock)(struct _FXMEM_SystemMgr* pMgr, void* handle);
29
30 void (*Unlock)(struct _FXMEM_SystemMgr* pMgr, void* handle);
31
32 void (*Free)(struct _FXMEM_SystemMgr* pMgr, void* pointer, int flags);
33
34 void (*Purge)(struct _FXMEM_SystemMgr* pMgr);
35
36 void (*CollectAll)(struct _FXMEM_SystemMgr* pMgr);
37
38
39 void* user;
40 } FXMEM_SystemMgr;
41 FX_DEFINEHANDLE(FXMEM_FoxitMgr)
42 typedef struct _FXMEM_SystemMgr2 {
43
44 FX_BOOL (*More)(struct _FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size);
45
46 void (*Free)(struct _FXMEM_SystemMgr2* pMgr, void* memory);
47 } FXMEM_SystemMgr2;
48 FXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible);
49 void FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr);
50 void* FXMEM_DefaultAlloc(size_t byte_size, int flags);
51 void* FXMEM_DefaultAlloc2(size_t units, size_t unit_size, int flags);
52 void* FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags);
53 void* FXMEM_DefaultRealloc2(void* pointer, size_t units, size_t unit_size, int flags);
54 void FXMEM_DefaultFree(void* pointer, int flags);
55 #define FX_Alloc(type, size) (type*)FXMEM_DefaultAlloc2(size, sizeof(type), 0)
56 #define FX_Realloc(type, ptr, size) (type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), 0)
57 #define FX_AllocNL(type, size) (type*)FXMEM_DefaultAlloc2(size, sizeof(type), FXMEM_NONLEAVE)
58 #define FX_ReallocNL(type, ptr, size) (type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), FXMEM_NONLEAVE)
59 #define FX_Free(pointer) FXMEM_DefaultFree(pointer, 0)
60 #ifdef __cplusplus
61 }
62 #endif
63 #ifdef __cplusplus
64 #if defined(_DEBUG)
65 #define FX_NEW new(__FILE__, __LINE__)
66 #else
67
68 #define FX_NEW new
69 #endif
70 class CFX_Object
71 {
72 public:
73
74 void* operator new (size_t size, FX_LPCSTR file, int line);
75
76 void operator delete (void* p, FX_LPCSTR file, int line);
77
78 void* operator new (size_t size);
79
80 void operator delete (void* p);
81
82 void* operator new[] (size_t size, FX_LPCSTR file, int line);
83
84 void operator delete[] (void* p, FX_LPCSTR file, int line);
85
86 void* operator new[] (size_t size);
87
88 void operator delete[] (void* p);
89
new(size_t,void * buf)90 void* operator new (size_t, void* buf)
91 {
92 return buf;
93 }
94
delete(void *,void *)95 void operator delete (void*, void*) {}
96 };
97 #define FX_NEW_VECTOR(Pointer, Class, Count) \
98 { \
99 Pointer = FX_Alloc(Class, Count); \
100 if (Pointer) { \
101 for (int i = 0; i < (Count); i ++) new (Pointer + i) Class; \
102 } \
103 }
104 #define FX_DELETE_VECTOR(Pointer, Class, Count) \
105 { \
106 for (int i = 0; i < (Count); i ++) Pointer[i].~Class(); \
107 FX_Free(Pointer); \
108 }
109 class CFX_DestructObject : public CFX_Object
110 {
111 public:
112
~CFX_DestructObject()113 virtual ~CFX_DestructObject() {}
114 };
115 #ifdef __cplusplus
116 extern "C" {
117 #endif
118 typedef struct _IFX_Allocator {
119
120 void* (*m_AllocDebug)(struct _IFX_Allocator* pAllocator, size_t size, FX_LPCSTR file, int line);
121
122 void* (*m_Alloc)(struct _IFX_Allocator* pAllocator, size_t size);
123
124 void* (*m_ReallocDebug)(struct _IFX_Allocator* pAllocator, void* p, size_t size, FX_LPCSTR file, int line);
125
126 void* (*m_Realloc)(struct _IFX_Allocator* pAllocator, void* p, size_t size);
127
128 void (*m_Free)(struct _IFX_Allocator* pAllocator, void* p);
129 } IFX_Allocator;
130 IFX_Allocator* FXMEM_GetDefAllocator();
131 #ifdef __cplusplus
132 }
133 #endif
134 #ifdef _DEBUG
135
136 #define FX_Allocator_Alloc(fxAllocator, type, size) \
137 ((fxAllocator) ? (type*)(fxAllocator)->m_AllocDebug((fxAllocator), (size) * sizeof(type), __FILE__, __LINE__) : (FX_Alloc(type, size)))
138
139 #define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \
140 ((fxAllocator) ? (type*)(fxAllocator)->m_ReallocDebug((fxAllocator), (ptr), (new_size) * sizeof(type), __FILE__, __LINE__) : (FX_Realloc(type, ptr, new_size)))
141 #else
142
143 #define FX_Allocator_Alloc(fxAllocator, type, size) \
144 ((fxAllocator) ? (type*)(fxAllocator)->m_Alloc((fxAllocator), (size) * sizeof(type)) : (FX_Alloc(type, size)))
145
146 #define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \
147 ((fxAllocator) ? (type*)(fxAllocator)->m_Realloc((fxAllocator), (ptr), (new_size) * sizeof(type)) : (FX_Realloc(type, ptr, new_size)))
148 #endif
149 #define FX_Allocator_Free(fxAllocator, ptr) \
150 ((fxAllocator) ? (fxAllocator)->m_Free((fxAllocator), (ptr)) : (FX_Free(ptr)))
new(size_t size,IFX_Allocator * fxAllocator)151 inline void* operator new(size_t size, IFX_Allocator* fxAllocator)
152 {
153 return (void*)FX_Allocator_Alloc(fxAllocator, FX_BYTE, size);
154 }
delete(void * ptr,IFX_Allocator * fxAllocator)155 inline void operator delete(void* ptr, IFX_Allocator* fxAllocator)
156 {
157 }
158 #define FX_NewAtAllocator(fxAllocator) \
159 ::new(fxAllocator)
160 #define FX_DeleteAtAllocator(pointer, fxAllocator, __class__) \
161 (pointer)->~__class__(); \
162 FX_Allocator_Free(fxAllocator, pointer)
163 class CFX_AllocObject
164 {
165 public:
166
167 void* operator new (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line);
168 #ifndef _FX_NO_EXCEPTION_
169
170 void operator delete (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line);
171 #endif
172
173 void* operator new (size_t size, IFX_Allocator* pAllocator);
174
175 void operator delete (void* p);
176 #ifndef _FX_NO_EXCEPTION_
177
178 void operator delete (void* p, IFX_Allocator* pAllocator);
179 #endif
180
new(size_t,void * buf)181 void* operator new (size_t, void* buf)
182 {
183 return buf;
184 }
185 #ifndef _FX_NO_EXCEPTION_
186
delete(void *,void *)187 void operator delete (void*, void*) {}
188 #endif
189
GetAllocator()190 IFX_Allocator* GetAllocator() const
191 {
192 return m_pAllocator;
193 }
194 private:
195
196 void* operator new[] (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line)
197 {
198 return operator new(size, pAllocator, file, line);
199 }
200 #ifndef _FX_NO_EXCEPTION_
201
202 void operator delete[] (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line) {}
203 #endif
204
205 void* operator new[] (size_t size, IFX_Allocator* pAllocator)
206 {
207 return operator new(size, pAllocator);
208 }
209
210 void operator delete[] (void* p) {}
211 #ifndef _FX_NO_EXCEPTION_
212
213 void operator delete[] (void* p, IFX_Allocator* pAllocator) {}
214 #endif
215 protected:
216
217 IFX_Allocator* m_pAllocator;
218 };
219 #if defined(_DEBUG)
220 #define FX_NEWAT(pAllocator) new(pAllocator, __FILE__, __LINE__)
221 #else
222
223 #define FX_NEWAT(pAllocator) new(pAllocator)
224 #endif
225 class CFX_GrowOnlyPool : public IFX_Allocator, public CFX_Object
226 {
227 public:
228
229 CFX_GrowOnlyPool(IFX_Allocator* pAllocator = NULL, size_t trunk_size = 16384);
230
231 ~CFX_GrowOnlyPool();
232
233 void SetAllocator(IFX_Allocator* pAllocator);
234
SetTrunkSize(size_t trunk_size)235 void SetTrunkSize(size_t trunk_size)
236 {
237 m_TrunkSize = trunk_size;
238 }
239
AllocDebug(size_t size,FX_LPCSTR file,int line)240 void* AllocDebug(size_t size, FX_LPCSTR file, int line)
241 {
242 return Alloc(size);
243 }
244
245 void* Alloc(size_t size);
246
ReallocDebug(void * p,size_t new_size,FX_LPCSTR file,int line)247 void* ReallocDebug(void* p, size_t new_size, FX_LPCSTR file, int line)
248 {
249 return NULL;
250 }
251
Realloc(void * p,size_t new_size)252 void* Realloc(void* p, size_t new_size)
253 {
254 return NULL;
255 }
256
Free(void *)257 void Free(void*) {}
258
259 void FreeAll();
260 private:
261
262 size_t m_TrunkSize;
263
264 void* m_pFirstTrunk;
265
266 IFX_Allocator* m_pAllocator;
267 };
268 #endif
269 #ifdef __cplusplus
270 extern "C" {
271 #endif
272 #define FX_FIXEDMEM_PAGESIZE (4096 * 16)
273 #define FX_FIXEDMEM_MIDBLOCKSIZE (4096)
274 typedef struct _FX_MEMCONFIG {
275
276 size_t nPageNum_Init8;
277
278 size_t nPageNum_Init16;
279
280 size_t nPageNum_Init32;
281
282 size_t nPageNum_More16;
283
284 size_t nPageNum_More32;
285
286 size_t nPageSize_Mid;
287
288 size_t nPageNum_InitMid;
289
290 size_t nPageNum_MoreMid;
291
292 size_t nPageSize_Large;
293
294 size_t nPageSize_Alone;
295 } FX_MEMCONFIG;
296 void FXMEM_SetConfig(const FX_MEMCONFIG* memConfig);
297 #ifdef __cplusplus
298 }
299 #endif
300 #endif
301