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