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
16extern "C" {
17#endif
18typedef 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;
41FX_DEFINEHANDLE(FXMEM_FoxitMgr)
42typedef 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;
48FXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible);
49void	FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr);
50void*	FXMEM_DefaultAlloc(size_t byte_size, int flags);
51void*	FXMEM_DefaultAlloc2(size_t units, size_t unit_size, int flags);
52void*	FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags);
53void*	FXMEM_DefaultRealloc2(void* pointer, size_t units, size_t unit_size, int flags);
54void	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
70class CFX_Object
71{
72public:
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
90    void*			operator new (size_t, void* buf)
91    {
92        return buf;
93    }
94
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    }
109class CFX_DestructObject : public CFX_Object
110{
111public:
112
113    virtual ~CFX_DestructObject() {}
114};
115#ifdef __cplusplus
116extern "C" {
117#endif
118typedef 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;
130IFX_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)))
151inline void* operator new(size_t size, IFX_Allocator* fxAllocator)
152{
153    return (void*)FX_Allocator_Alloc(fxAllocator, FX_BYTE, size);
154}
155inline 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)
163class CFX_AllocObject
164{
165public:
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
181    void*			operator new (size_t, void* buf)
182    {
183        return buf;
184    }
185#ifndef _FX_NO_EXCEPTION_
186
187    void			operator delete (void*, void*) {}
188#endif
189
190    IFX_Allocator*	GetAllocator() const
191    {
192        return m_pAllocator;
193    }
194private:
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
215protected:
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
225class CFX_GrowOnlyPool : public IFX_Allocator, public CFX_Object
226{
227public:
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
235    void	SetTrunkSize(size_t trunk_size)
236    {
237        m_TrunkSize = trunk_size;
238    }
239
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
247    void*	ReallocDebug(void* p, size_t new_size, FX_LPCSTR file, int line)
248    {
249        return NULL;
250    }
251
252    void*	Realloc(void* p, size_t new_size)
253    {
254        return NULL;
255    }
256
257    void	Free(void*) {}
258
259    void	FreeAll();
260private:
261
262    size_t	m_TrunkSize;
263
264    void*	m_pFirstTrunk;
265
266    IFX_Allocator*	m_pAllocator;
267};
268#endif
269#ifdef __cplusplus
270extern "C" {
271#endif
272#define FX_FIXEDMEM_PAGESIZE		(4096 * 16)
273#define FX_FIXEDMEM_MIDBLOCKSIZE	(4096)
274typedef 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;
296void	FXMEM_SetConfig(const FX_MEMCONFIG* memConfig);
297#ifdef __cplusplus
298}
299#endif
300#endif
301