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