1*f6dc9357SAndroid Build Coastguard Worker /* Alloc.c -- Memory allocation functions
2*f6dc9357SAndroid Build Coastguard Worker 2024-02-18 : Igor Pavlov : Public domain */
3*f6dc9357SAndroid Build Coastguard Worker
4*f6dc9357SAndroid Build Coastguard Worker #include "Precomp.h"
5*f6dc9357SAndroid Build Coastguard Worker
6*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
7*f6dc9357SAndroid Build Coastguard Worker #include "7zWindows.h"
8*f6dc9357SAndroid Build Coastguard Worker #endif
9*f6dc9357SAndroid Build Coastguard Worker #include <stdlib.h>
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "Alloc.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_LARGE_PAGES) && defined(_WIN32) && \
14*f6dc9357SAndroid Build Coastguard Worker (!defined(Z7_WIN32_WINNT_MIN) || Z7_WIN32_WINNT_MIN < 0x0502) // < Win2003 (xp-64)
15*f6dc9357SAndroid Build Coastguard Worker #define Z7_USE_DYN_GetLargePageMinimum
16*f6dc9357SAndroid Build Coastguard Worker #endif
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker // for debug:
19*f6dc9357SAndroid Build Coastguard Worker #if 0
20*f6dc9357SAndroid Build Coastguard Worker #if defined(__CHERI__) && defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 16)
21*f6dc9357SAndroid Build Coastguard Worker // #pragma message("=== Z7_ALLOC_NO_OFFSET_ALLOCATOR === ")
22*f6dc9357SAndroid Build Coastguard Worker #define Z7_ALLOC_NO_OFFSET_ALLOCATOR
23*f6dc9357SAndroid Build Coastguard Worker #endif
24*f6dc9357SAndroid Build Coastguard Worker #endif
25*f6dc9357SAndroid Build Coastguard Worker
26*f6dc9357SAndroid Build Coastguard Worker // #define SZ_ALLOC_DEBUG
27*f6dc9357SAndroid Build Coastguard Worker /* #define SZ_ALLOC_DEBUG */
28*f6dc9357SAndroid Build Coastguard Worker
29*f6dc9357SAndroid Build Coastguard Worker /* use SZ_ALLOC_DEBUG to debug alloc/free operations */
30*f6dc9357SAndroid Build Coastguard Worker #ifdef SZ_ALLOC_DEBUG
31*f6dc9357SAndroid Build Coastguard Worker
32*f6dc9357SAndroid Build Coastguard Worker #include <string.h>
33*f6dc9357SAndroid Build Coastguard Worker #include <stdio.h>
34*f6dc9357SAndroid Build Coastguard Worker static int g_allocCount = 0;
35*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
36*f6dc9357SAndroid Build Coastguard Worker static int g_allocCountMid = 0;
37*f6dc9357SAndroid Build Coastguard Worker static int g_allocCountBig = 0;
38*f6dc9357SAndroid Build Coastguard Worker #endif
39*f6dc9357SAndroid Build Coastguard Worker
40*f6dc9357SAndroid Build Coastguard Worker
41*f6dc9357SAndroid Build Coastguard Worker #define CONVERT_INT_TO_STR(charType, tempSize) \
42*f6dc9357SAndroid Build Coastguard Worker char temp[tempSize]; unsigned i = 0; \
43*f6dc9357SAndroid Build Coastguard Worker while (val >= 10) { temp[i++] = (char)('0' + (unsigned)(val % 10)); val /= 10; } \
44*f6dc9357SAndroid Build Coastguard Worker *s++ = (charType)('0' + (unsigned)val); \
45*f6dc9357SAndroid Build Coastguard Worker while (i != 0) { i--; *s++ = temp[i]; } \
46*f6dc9357SAndroid Build Coastguard Worker *s = 0;
47*f6dc9357SAndroid Build Coastguard Worker
ConvertUInt64ToString(UInt64 val,char * s)48*f6dc9357SAndroid Build Coastguard Worker static void ConvertUInt64ToString(UInt64 val, char *s)
49*f6dc9357SAndroid Build Coastguard Worker {
50*f6dc9357SAndroid Build Coastguard Worker CONVERT_INT_TO_STR(char, 24)
51*f6dc9357SAndroid Build Coastguard Worker }
52*f6dc9357SAndroid Build Coastguard Worker
53*f6dc9357SAndroid Build Coastguard Worker #define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10)))))
54*f6dc9357SAndroid Build Coastguard Worker
ConvertUInt64ToHex(UInt64 val,char * s)55*f6dc9357SAndroid Build Coastguard Worker static void ConvertUInt64ToHex(UInt64 val, char *s)
56*f6dc9357SAndroid Build Coastguard Worker {
57*f6dc9357SAndroid Build Coastguard Worker UInt64 v = val;
58*f6dc9357SAndroid Build Coastguard Worker unsigned i;
59*f6dc9357SAndroid Build Coastguard Worker for (i = 1;; i++)
60*f6dc9357SAndroid Build Coastguard Worker {
61*f6dc9357SAndroid Build Coastguard Worker v >>= 4;
62*f6dc9357SAndroid Build Coastguard Worker if (v == 0)
63*f6dc9357SAndroid Build Coastguard Worker break;
64*f6dc9357SAndroid Build Coastguard Worker }
65*f6dc9357SAndroid Build Coastguard Worker s[i] = 0;
66*f6dc9357SAndroid Build Coastguard Worker do
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker unsigned t = (unsigned)(val & 0xF);
69*f6dc9357SAndroid Build Coastguard Worker val >>= 4;
70*f6dc9357SAndroid Build Coastguard Worker s[--i] = GET_HEX_CHAR(t);
71*f6dc9357SAndroid Build Coastguard Worker }
72*f6dc9357SAndroid Build Coastguard Worker while (i);
73*f6dc9357SAndroid Build Coastguard Worker }
74*f6dc9357SAndroid Build Coastguard Worker
75*f6dc9357SAndroid Build Coastguard Worker #define DEBUG_OUT_STREAM stderr
76*f6dc9357SAndroid Build Coastguard Worker
Print(const char * s)77*f6dc9357SAndroid Build Coastguard Worker static void Print(const char *s)
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker fputs(s, DEBUG_OUT_STREAM);
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker
PrintAligned(const char * s,size_t align)82*f6dc9357SAndroid Build Coastguard Worker static void PrintAligned(const char *s, size_t align)
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker size_t len = strlen(s);
85*f6dc9357SAndroid Build Coastguard Worker for(;;)
86*f6dc9357SAndroid Build Coastguard Worker {
87*f6dc9357SAndroid Build Coastguard Worker fputc(' ', DEBUG_OUT_STREAM);
88*f6dc9357SAndroid Build Coastguard Worker if (len >= align)
89*f6dc9357SAndroid Build Coastguard Worker break;
90*f6dc9357SAndroid Build Coastguard Worker ++len;
91*f6dc9357SAndroid Build Coastguard Worker }
92*f6dc9357SAndroid Build Coastguard Worker Print(s);
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker
PrintLn(void)95*f6dc9357SAndroid Build Coastguard Worker static void PrintLn(void)
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker Print("\n");
98*f6dc9357SAndroid Build Coastguard Worker }
99*f6dc9357SAndroid Build Coastguard Worker
PrintHex(UInt64 v,size_t align)100*f6dc9357SAndroid Build Coastguard Worker static void PrintHex(UInt64 v, size_t align)
101*f6dc9357SAndroid Build Coastguard Worker {
102*f6dc9357SAndroid Build Coastguard Worker char s[32];
103*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToHex(v, s);
104*f6dc9357SAndroid Build Coastguard Worker PrintAligned(s, align);
105*f6dc9357SAndroid Build Coastguard Worker }
106*f6dc9357SAndroid Build Coastguard Worker
PrintDec(int v,size_t align)107*f6dc9357SAndroid Build Coastguard Worker static void PrintDec(int v, size_t align)
108*f6dc9357SAndroid Build Coastguard Worker {
109*f6dc9357SAndroid Build Coastguard Worker char s[32];
110*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString((unsigned)v, s);
111*f6dc9357SAndroid Build Coastguard Worker PrintAligned(s, align);
112*f6dc9357SAndroid Build Coastguard Worker }
113*f6dc9357SAndroid Build Coastguard Worker
PrintAddr(void * p)114*f6dc9357SAndroid Build Coastguard Worker static void PrintAddr(void *p)
115*f6dc9357SAndroid Build Coastguard Worker {
116*f6dc9357SAndroid Build Coastguard Worker PrintHex((UInt64)(size_t)(ptrdiff_t)p, 12);
117*f6dc9357SAndroid Build Coastguard Worker }
118*f6dc9357SAndroid Build Coastguard Worker
119*f6dc9357SAndroid Build Coastguard Worker
120*f6dc9357SAndroid Build Coastguard Worker #define PRINT_REALLOC(name, cnt, size, ptr) { \
121*f6dc9357SAndroid Build Coastguard Worker Print(name " "); \
122*f6dc9357SAndroid Build Coastguard Worker if (!ptr) PrintDec(cnt++, 10); \
123*f6dc9357SAndroid Build Coastguard Worker PrintHex(size, 10); \
124*f6dc9357SAndroid Build Coastguard Worker PrintAddr(ptr); \
125*f6dc9357SAndroid Build Coastguard Worker PrintLn(); }
126*f6dc9357SAndroid Build Coastguard Worker
127*f6dc9357SAndroid Build Coastguard Worker #define PRINT_ALLOC(name, cnt, size, ptr) { \
128*f6dc9357SAndroid Build Coastguard Worker Print(name " "); \
129*f6dc9357SAndroid Build Coastguard Worker PrintDec(cnt++, 10); \
130*f6dc9357SAndroid Build Coastguard Worker PrintHex(size, 10); \
131*f6dc9357SAndroid Build Coastguard Worker PrintAddr(ptr); \
132*f6dc9357SAndroid Build Coastguard Worker PrintLn(); }
133*f6dc9357SAndroid Build Coastguard Worker
134*f6dc9357SAndroid Build Coastguard Worker #define PRINT_FREE(name, cnt, ptr) if (ptr) { \
135*f6dc9357SAndroid Build Coastguard Worker Print(name " "); \
136*f6dc9357SAndroid Build Coastguard Worker PrintDec(--cnt, 10); \
137*f6dc9357SAndroid Build Coastguard Worker PrintAddr(ptr); \
138*f6dc9357SAndroid Build Coastguard Worker PrintLn(); }
139*f6dc9357SAndroid Build Coastguard Worker
140*f6dc9357SAndroid Build Coastguard Worker #else
141*f6dc9357SAndroid Build Coastguard Worker
142*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
143*f6dc9357SAndroid Build Coastguard Worker #define PRINT_ALLOC(name, cnt, size, ptr)
144*f6dc9357SAndroid Build Coastguard Worker #endif
145*f6dc9357SAndroid Build Coastguard Worker #define PRINT_FREE(name, cnt, ptr)
146*f6dc9357SAndroid Build Coastguard Worker #define Print(s)
147*f6dc9357SAndroid Build Coastguard Worker #define PrintLn()
148*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ALLOC_NO_OFFSET_ALLOCATOR
149*f6dc9357SAndroid Build Coastguard Worker #define PrintHex(v, align)
150*f6dc9357SAndroid Build Coastguard Worker #endif
151*f6dc9357SAndroid Build Coastguard Worker #define PrintAddr(p)
152*f6dc9357SAndroid Build Coastguard Worker
153*f6dc9357SAndroid Build Coastguard Worker #endif
154*f6dc9357SAndroid Build Coastguard Worker
155*f6dc9357SAndroid Build Coastguard Worker
156*f6dc9357SAndroid Build Coastguard Worker /*
157*f6dc9357SAndroid Build Coastguard Worker by specification:
158*f6dc9357SAndroid Build Coastguard Worker malloc(non_NULL, 0) : returns NULL or a unique pointer value that can later be successfully passed to free()
159*f6dc9357SAndroid Build Coastguard Worker realloc(NULL, size) : the call is equivalent to malloc(size)
160*f6dc9357SAndroid Build Coastguard Worker realloc(non_NULL, 0) : the call is equivalent to free(ptr)
161*f6dc9357SAndroid Build Coastguard Worker
162*f6dc9357SAndroid Build Coastguard Worker in main compilers:
163*f6dc9357SAndroid Build Coastguard Worker malloc(0) : returns non_NULL
164*f6dc9357SAndroid Build Coastguard Worker realloc(NULL, 0) : returns non_NULL
165*f6dc9357SAndroid Build Coastguard Worker realloc(non_NULL, 0) : returns NULL
166*f6dc9357SAndroid Build Coastguard Worker */
167*f6dc9357SAndroid Build Coastguard Worker
168*f6dc9357SAndroid Build Coastguard Worker
MyAlloc(size_t size)169*f6dc9357SAndroid Build Coastguard Worker void *MyAlloc(size_t size)
170*f6dc9357SAndroid Build Coastguard Worker {
171*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
172*f6dc9357SAndroid Build Coastguard Worker return NULL;
173*f6dc9357SAndroid Build Coastguard Worker // PRINT_ALLOC("Alloc ", g_allocCount, size, NULL)
174*f6dc9357SAndroid Build Coastguard Worker #ifdef SZ_ALLOC_DEBUG
175*f6dc9357SAndroid Build Coastguard Worker {
176*f6dc9357SAndroid Build Coastguard Worker void *p = malloc(size);
177*f6dc9357SAndroid Build Coastguard Worker if (p)
178*f6dc9357SAndroid Build Coastguard Worker {
179*f6dc9357SAndroid Build Coastguard Worker PRINT_ALLOC("Alloc ", g_allocCount, size, p)
180*f6dc9357SAndroid Build Coastguard Worker }
181*f6dc9357SAndroid Build Coastguard Worker return p;
182*f6dc9357SAndroid Build Coastguard Worker }
183*f6dc9357SAndroid Build Coastguard Worker #else
184*f6dc9357SAndroid Build Coastguard Worker return malloc(size);
185*f6dc9357SAndroid Build Coastguard Worker #endif
186*f6dc9357SAndroid Build Coastguard Worker }
187*f6dc9357SAndroid Build Coastguard Worker
MyFree(void * address)188*f6dc9357SAndroid Build Coastguard Worker void MyFree(void *address)
189*f6dc9357SAndroid Build Coastguard Worker {
190*f6dc9357SAndroid Build Coastguard Worker PRINT_FREE("Free ", g_allocCount, address)
191*f6dc9357SAndroid Build Coastguard Worker
192*f6dc9357SAndroid Build Coastguard Worker free(address);
193*f6dc9357SAndroid Build Coastguard Worker }
194*f6dc9357SAndroid Build Coastguard Worker
MyRealloc(void * address,size_t size)195*f6dc9357SAndroid Build Coastguard Worker void *MyRealloc(void *address, size_t size)
196*f6dc9357SAndroid Build Coastguard Worker {
197*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
198*f6dc9357SAndroid Build Coastguard Worker {
199*f6dc9357SAndroid Build Coastguard Worker MyFree(address);
200*f6dc9357SAndroid Build Coastguard Worker return NULL;
201*f6dc9357SAndroid Build Coastguard Worker }
202*f6dc9357SAndroid Build Coastguard Worker // PRINT_REALLOC("Realloc ", g_allocCount, size, address)
203*f6dc9357SAndroid Build Coastguard Worker #ifdef SZ_ALLOC_DEBUG
204*f6dc9357SAndroid Build Coastguard Worker {
205*f6dc9357SAndroid Build Coastguard Worker void *p = realloc(address, size);
206*f6dc9357SAndroid Build Coastguard Worker if (p)
207*f6dc9357SAndroid Build Coastguard Worker {
208*f6dc9357SAndroid Build Coastguard Worker PRINT_REALLOC("Realloc ", g_allocCount, size, address)
209*f6dc9357SAndroid Build Coastguard Worker }
210*f6dc9357SAndroid Build Coastguard Worker return p;
211*f6dc9357SAndroid Build Coastguard Worker }
212*f6dc9357SAndroid Build Coastguard Worker #else
213*f6dc9357SAndroid Build Coastguard Worker return realloc(address, size);
214*f6dc9357SAndroid Build Coastguard Worker #endif
215*f6dc9357SAndroid Build Coastguard Worker }
216*f6dc9357SAndroid Build Coastguard Worker
217*f6dc9357SAndroid Build Coastguard Worker
218*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
219*f6dc9357SAndroid Build Coastguard Worker
MidAlloc(size_t size)220*f6dc9357SAndroid Build Coastguard Worker void *MidAlloc(size_t size)
221*f6dc9357SAndroid Build Coastguard Worker {
222*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
223*f6dc9357SAndroid Build Coastguard Worker return NULL;
224*f6dc9357SAndroid Build Coastguard Worker #ifdef SZ_ALLOC_DEBUG
225*f6dc9357SAndroid Build Coastguard Worker {
226*f6dc9357SAndroid Build Coastguard Worker void *p = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
227*f6dc9357SAndroid Build Coastguard Worker if (p)
228*f6dc9357SAndroid Build Coastguard Worker {
229*f6dc9357SAndroid Build Coastguard Worker PRINT_ALLOC("Alloc-Mid", g_allocCountMid, size, p)
230*f6dc9357SAndroid Build Coastguard Worker }
231*f6dc9357SAndroid Build Coastguard Worker return p;
232*f6dc9357SAndroid Build Coastguard Worker }
233*f6dc9357SAndroid Build Coastguard Worker #else
234*f6dc9357SAndroid Build Coastguard Worker return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
235*f6dc9357SAndroid Build Coastguard Worker #endif
236*f6dc9357SAndroid Build Coastguard Worker }
237*f6dc9357SAndroid Build Coastguard Worker
MidFree(void * address)238*f6dc9357SAndroid Build Coastguard Worker void MidFree(void *address)
239*f6dc9357SAndroid Build Coastguard Worker {
240*f6dc9357SAndroid Build Coastguard Worker PRINT_FREE("Free-Mid", g_allocCountMid, address)
241*f6dc9357SAndroid Build Coastguard Worker
242*f6dc9357SAndroid Build Coastguard Worker if (!address)
243*f6dc9357SAndroid Build Coastguard Worker return;
244*f6dc9357SAndroid Build Coastguard Worker VirtualFree(address, 0, MEM_RELEASE);
245*f6dc9357SAndroid Build Coastguard Worker }
246*f6dc9357SAndroid Build Coastguard Worker
247*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LARGE_PAGES
248*f6dc9357SAndroid Build Coastguard Worker
249*f6dc9357SAndroid Build Coastguard Worker #ifdef MEM_LARGE_PAGES
250*f6dc9357SAndroid Build Coastguard Worker #define MY_MEM_LARGE_PAGES MEM_LARGE_PAGES
251*f6dc9357SAndroid Build Coastguard Worker #else
252*f6dc9357SAndroid Build Coastguard Worker #define MY_MEM_LARGE_PAGES 0x20000000
253*f6dc9357SAndroid Build Coastguard Worker #endif
254*f6dc9357SAndroid Build Coastguard Worker
255*f6dc9357SAndroid Build Coastguard Worker extern
256*f6dc9357SAndroid Build Coastguard Worker SIZE_T g_LargePageSize;
257*f6dc9357SAndroid Build Coastguard Worker SIZE_T g_LargePageSize = 0;
258*f6dc9357SAndroid Build Coastguard Worker typedef SIZE_T (WINAPI *Func_GetLargePageMinimum)(VOID);
259*f6dc9357SAndroid Build Coastguard Worker
SetLargePageSize(void)260*f6dc9357SAndroid Build Coastguard Worker void SetLargePageSize(void)
261*f6dc9357SAndroid Build Coastguard Worker {
262*f6dc9357SAndroid Build Coastguard Worker SIZE_T size;
263*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_DYN_GetLargePageMinimum
264*f6dc9357SAndroid Build Coastguard Worker Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
265*f6dc9357SAndroid Build Coastguard Worker
266*f6dc9357SAndroid Build Coastguard Worker const
267*f6dc9357SAndroid Build Coastguard Worker Func_GetLargePageMinimum fn =
268*f6dc9357SAndroid Build Coastguard Worker (Func_GetLargePageMinimum) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
269*f6dc9357SAndroid Build Coastguard Worker "GetLargePageMinimum");
270*f6dc9357SAndroid Build Coastguard Worker if (!fn)
271*f6dc9357SAndroid Build Coastguard Worker return;
272*f6dc9357SAndroid Build Coastguard Worker size = fn();
273*f6dc9357SAndroid Build Coastguard Worker #else
274*f6dc9357SAndroid Build Coastguard Worker size = GetLargePageMinimum();
275*f6dc9357SAndroid Build Coastguard Worker #endif
276*f6dc9357SAndroid Build Coastguard Worker if (size == 0 || (size & (size - 1)) != 0)
277*f6dc9357SAndroid Build Coastguard Worker return;
278*f6dc9357SAndroid Build Coastguard Worker g_LargePageSize = size;
279*f6dc9357SAndroid Build Coastguard Worker }
280*f6dc9357SAndroid Build Coastguard Worker
281*f6dc9357SAndroid Build Coastguard Worker #endif // Z7_LARGE_PAGES
282*f6dc9357SAndroid Build Coastguard Worker
BigAlloc(size_t size)283*f6dc9357SAndroid Build Coastguard Worker void *BigAlloc(size_t size)
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker if (size == 0)
286*f6dc9357SAndroid Build Coastguard Worker return NULL;
287*f6dc9357SAndroid Build Coastguard Worker
288*f6dc9357SAndroid Build Coastguard Worker PRINT_ALLOC("Alloc-Big", g_allocCountBig, size, NULL)
289*f6dc9357SAndroid Build Coastguard Worker
290*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LARGE_PAGES
291*f6dc9357SAndroid Build Coastguard Worker {
292*f6dc9357SAndroid Build Coastguard Worker SIZE_T ps = g_LargePageSize;
293*f6dc9357SAndroid Build Coastguard Worker if (ps != 0 && ps <= (1 << 30) && size > (ps / 2))
294*f6dc9357SAndroid Build Coastguard Worker {
295*f6dc9357SAndroid Build Coastguard Worker size_t size2;
296*f6dc9357SAndroid Build Coastguard Worker ps--;
297*f6dc9357SAndroid Build Coastguard Worker size2 = (size + ps) & ~ps;
298*f6dc9357SAndroid Build Coastguard Worker if (size2 >= size)
299*f6dc9357SAndroid Build Coastguard Worker {
300*f6dc9357SAndroid Build Coastguard Worker void *p = VirtualAlloc(NULL, size2, MEM_COMMIT | MY_MEM_LARGE_PAGES, PAGE_READWRITE);
301*f6dc9357SAndroid Build Coastguard Worker if (p)
302*f6dc9357SAndroid Build Coastguard Worker {
303*f6dc9357SAndroid Build Coastguard Worker PRINT_ALLOC("Alloc-BM ", g_allocCountMid, size2, p)
304*f6dc9357SAndroid Build Coastguard Worker return p;
305*f6dc9357SAndroid Build Coastguard Worker }
306*f6dc9357SAndroid Build Coastguard Worker }
307*f6dc9357SAndroid Build Coastguard Worker }
308*f6dc9357SAndroid Build Coastguard Worker }
309*f6dc9357SAndroid Build Coastguard Worker #endif
310*f6dc9357SAndroid Build Coastguard Worker
311*f6dc9357SAndroid Build Coastguard Worker return MidAlloc(size);
312*f6dc9357SAndroid Build Coastguard Worker }
313*f6dc9357SAndroid Build Coastguard Worker
BigFree(void * address)314*f6dc9357SAndroid Build Coastguard Worker void BigFree(void *address)
315*f6dc9357SAndroid Build Coastguard Worker {
316*f6dc9357SAndroid Build Coastguard Worker PRINT_FREE("Free-Big", g_allocCountBig, address)
317*f6dc9357SAndroid Build Coastguard Worker MidFree(address);
318*f6dc9357SAndroid Build Coastguard Worker }
319*f6dc9357SAndroid Build Coastguard Worker
320*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32
321*f6dc9357SAndroid Build Coastguard Worker
322*f6dc9357SAndroid Build Coastguard Worker
SzAlloc(ISzAllocPtr p,size_t size)323*f6dc9357SAndroid Build Coastguard Worker static void *SzAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return MyAlloc(size); }
SzFree(ISzAllocPtr p,void * address)324*f6dc9357SAndroid Build Coastguard Worker static void SzFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) MyFree(address); }
325*f6dc9357SAndroid Build Coastguard Worker const ISzAlloc g_Alloc = { SzAlloc, SzFree };
326*f6dc9357SAndroid Build Coastguard Worker
327*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
SzMidAlloc(ISzAllocPtr p,size_t size)328*f6dc9357SAndroid Build Coastguard Worker static void *SzMidAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return MidAlloc(size); }
SzMidFree(ISzAllocPtr p,void * address)329*f6dc9357SAndroid Build Coastguard Worker static void SzMidFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) MidFree(address); }
SzBigAlloc(ISzAllocPtr p,size_t size)330*f6dc9357SAndroid Build Coastguard Worker static void *SzBigAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return BigAlloc(size); }
SzBigFree(ISzAllocPtr p,void * address)331*f6dc9357SAndroid Build Coastguard Worker static void SzBigFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) BigFree(address); }
332*f6dc9357SAndroid Build Coastguard Worker const ISzAlloc g_MidAlloc = { SzMidAlloc, SzMidFree };
333*f6dc9357SAndroid Build Coastguard Worker const ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
334*f6dc9357SAndroid Build Coastguard Worker #endif
335*f6dc9357SAndroid Build Coastguard Worker
336*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ALLOC_NO_OFFSET_ALLOCATOR
337*f6dc9357SAndroid Build Coastguard Worker
338*f6dc9357SAndroid Build Coastguard Worker #define ADJUST_ALLOC_SIZE 0
339*f6dc9357SAndroid Build Coastguard Worker /*
340*f6dc9357SAndroid Build Coastguard Worker #define ADJUST_ALLOC_SIZE (sizeof(void *) - 1)
341*f6dc9357SAndroid Build Coastguard Worker */
342*f6dc9357SAndroid Build Coastguard Worker /*
343*f6dc9357SAndroid Build Coastguard Worker Use (ADJUST_ALLOC_SIZE = (sizeof(void *) - 1)), if
344*f6dc9357SAndroid Build Coastguard Worker MyAlloc() can return address that is NOT multiple of sizeof(void *).
345*f6dc9357SAndroid Build Coastguard Worker */
346*f6dc9357SAndroid Build Coastguard Worker
347*f6dc9357SAndroid Build Coastguard Worker /*
348*f6dc9357SAndroid Build Coastguard Worker uintptr_t : <stdint.h> C99 (optional)
349*f6dc9357SAndroid Build Coastguard Worker : unsupported in VS6
350*f6dc9357SAndroid Build Coastguard Worker */
351*f6dc9357SAndroid Build Coastguard Worker typedef
352*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
353*f6dc9357SAndroid Build Coastguard Worker UINT_PTR
354*f6dc9357SAndroid Build Coastguard Worker #elif 1
355*f6dc9357SAndroid Build Coastguard Worker uintptr_t
356*f6dc9357SAndroid Build Coastguard Worker #else
357*f6dc9357SAndroid Build Coastguard Worker ptrdiff_t
358*f6dc9357SAndroid Build Coastguard Worker #endif
359*f6dc9357SAndroid Build Coastguard Worker MY_uintptr_t;
360*f6dc9357SAndroid Build Coastguard Worker
361*f6dc9357SAndroid Build Coastguard Worker #if 0 \
362*f6dc9357SAndroid Build Coastguard Worker || (defined(__CHERI__) \
363*f6dc9357SAndroid Build Coastguard Worker || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ > 8))
364*f6dc9357SAndroid Build Coastguard Worker // for 128-bit pointers (cheri):
365*f6dc9357SAndroid Build Coastguard Worker #define MY_ALIGN_PTR_DOWN(p, align) \
366*f6dc9357SAndroid Build Coastguard Worker ((void *)((char *)(p) - ((size_t)(MY_uintptr_t)(p) & ((align) - 1))))
367*f6dc9357SAndroid Build Coastguard Worker #else
368*f6dc9357SAndroid Build Coastguard Worker #define MY_ALIGN_PTR_DOWN(p, align) \
369*f6dc9357SAndroid Build Coastguard Worker ((void *)((((MY_uintptr_t)(p)) & ~((MY_uintptr_t)(align) - 1))))
370*f6dc9357SAndroid Build Coastguard Worker #endif
371*f6dc9357SAndroid Build Coastguard Worker
372*f6dc9357SAndroid Build Coastguard Worker #endif
373*f6dc9357SAndroid Build Coastguard Worker
374*f6dc9357SAndroid Build Coastguard Worker #if !defined(_WIN32) \
375*f6dc9357SAndroid Build Coastguard Worker && (defined(Z7_ALLOC_NO_OFFSET_ALLOCATOR) \
376*f6dc9357SAndroid Build Coastguard Worker || defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))
377*f6dc9357SAndroid Build Coastguard Worker #define USE_posix_memalign
378*f6dc9357SAndroid Build Coastguard Worker #endif
379*f6dc9357SAndroid Build Coastguard Worker
380*f6dc9357SAndroid Build Coastguard Worker #ifndef USE_posix_memalign
381*f6dc9357SAndroid Build Coastguard Worker #define MY_ALIGN_PTR_UP_PLUS(p, align) MY_ALIGN_PTR_DOWN(((char *)(p) + (align) + ADJUST_ALLOC_SIZE), align)
382*f6dc9357SAndroid Build Coastguard Worker #endif
383*f6dc9357SAndroid Build Coastguard Worker
384*f6dc9357SAndroid Build Coastguard Worker /*
385*f6dc9357SAndroid Build Coastguard Worker This posix_memalign() is for test purposes only.
386*f6dc9357SAndroid Build Coastguard Worker We also need special Free() function instead of free(),
387*f6dc9357SAndroid Build Coastguard Worker if this posix_memalign() is used.
388*f6dc9357SAndroid Build Coastguard Worker */
389*f6dc9357SAndroid Build Coastguard Worker
390*f6dc9357SAndroid Build Coastguard Worker /*
391*f6dc9357SAndroid Build Coastguard Worker static int posix_memalign(void **ptr, size_t align, size_t size)
392*f6dc9357SAndroid Build Coastguard Worker {
393*f6dc9357SAndroid Build Coastguard Worker size_t newSize = size + align;
394*f6dc9357SAndroid Build Coastguard Worker void *p;
395*f6dc9357SAndroid Build Coastguard Worker void *pAligned;
396*f6dc9357SAndroid Build Coastguard Worker *ptr = NULL;
397*f6dc9357SAndroid Build Coastguard Worker if (newSize < size)
398*f6dc9357SAndroid Build Coastguard Worker return 12; // ENOMEM
399*f6dc9357SAndroid Build Coastguard Worker p = MyAlloc(newSize);
400*f6dc9357SAndroid Build Coastguard Worker if (!p)
401*f6dc9357SAndroid Build Coastguard Worker return 12; // ENOMEM
402*f6dc9357SAndroid Build Coastguard Worker pAligned = MY_ALIGN_PTR_UP_PLUS(p, align);
403*f6dc9357SAndroid Build Coastguard Worker ((void **)pAligned)[-1] = p;
404*f6dc9357SAndroid Build Coastguard Worker *ptr = pAligned;
405*f6dc9357SAndroid Build Coastguard Worker return 0;
406*f6dc9357SAndroid Build Coastguard Worker }
407*f6dc9357SAndroid Build Coastguard Worker */
408*f6dc9357SAndroid Build Coastguard Worker
409*f6dc9357SAndroid Build Coastguard Worker /*
410*f6dc9357SAndroid Build Coastguard Worker ALLOC_ALIGN_SIZE >= sizeof(void *)
411*f6dc9357SAndroid Build Coastguard Worker ALLOC_ALIGN_SIZE >= cache_line_size
412*f6dc9357SAndroid Build Coastguard Worker */
413*f6dc9357SAndroid Build Coastguard Worker
414*f6dc9357SAndroid Build Coastguard Worker #define ALLOC_ALIGN_SIZE ((size_t)1 << 7)
415*f6dc9357SAndroid Build Coastguard Worker
z7_AlignedAlloc(size_t size)416*f6dc9357SAndroid Build Coastguard Worker void *z7_AlignedAlloc(size_t size)
417*f6dc9357SAndroid Build Coastguard Worker {
418*f6dc9357SAndroid Build Coastguard Worker #ifndef USE_posix_memalign
419*f6dc9357SAndroid Build Coastguard Worker
420*f6dc9357SAndroid Build Coastguard Worker void *p;
421*f6dc9357SAndroid Build Coastguard Worker void *pAligned;
422*f6dc9357SAndroid Build Coastguard Worker size_t newSize;
423*f6dc9357SAndroid Build Coastguard Worker
424*f6dc9357SAndroid Build Coastguard Worker /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned
425*f6dc9357SAndroid Build Coastguard Worker block to prevent cache line sharing with another allocated blocks */
426*f6dc9357SAndroid Build Coastguard Worker
427*f6dc9357SAndroid Build Coastguard Worker newSize = size + ALLOC_ALIGN_SIZE * 1 + ADJUST_ALLOC_SIZE;
428*f6dc9357SAndroid Build Coastguard Worker if (newSize < size)
429*f6dc9357SAndroid Build Coastguard Worker return NULL;
430*f6dc9357SAndroid Build Coastguard Worker
431*f6dc9357SAndroid Build Coastguard Worker p = MyAlloc(newSize);
432*f6dc9357SAndroid Build Coastguard Worker
433*f6dc9357SAndroid Build Coastguard Worker if (!p)
434*f6dc9357SAndroid Build Coastguard Worker return NULL;
435*f6dc9357SAndroid Build Coastguard Worker pAligned = MY_ALIGN_PTR_UP_PLUS(p, ALLOC_ALIGN_SIZE);
436*f6dc9357SAndroid Build Coastguard Worker
437*f6dc9357SAndroid Build Coastguard Worker Print(" size="); PrintHex(size, 8);
438*f6dc9357SAndroid Build Coastguard Worker Print(" a_size="); PrintHex(newSize, 8);
439*f6dc9357SAndroid Build Coastguard Worker Print(" ptr="); PrintAddr(p);
440*f6dc9357SAndroid Build Coastguard Worker Print(" a_ptr="); PrintAddr(pAligned);
441*f6dc9357SAndroid Build Coastguard Worker PrintLn();
442*f6dc9357SAndroid Build Coastguard Worker
443*f6dc9357SAndroid Build Coastguard Worker ((void **)pAligned)[-1] = p;
444*f6dc9357SAndroid Build Coastguard Worker
445*f6dc9357SAndroid Build Coastguard Worker return pAligned;
446*f6dc9357SAndroid Build Coastguard Worker
447*f6dc9357SAndroid Build Coastguard Worker #else
448*f6dc9357SAndroid Build Coastguard Worker
449*f6dc9357SAndroid Build Coastguard Worker void *p;
450*f6dc9357SAndroid Build Coastguard Worker if (posix_memalign(&p, ALLOC_ALIGN_SIZE, size))
451*f6dc9357SAndroid Build Coastguard Worker return NULL;
452*f6dc9357SAndroid Build Coastguard Worker
453*f6dc9357SAndroid Build Coastguard Worker Print(" posix_memalign="); PrintAddr(p);
454*f6dc9357SAndroid Build Coastguard Worker PrintLn();
455*f6dc9357SAndroid Build Coastguard Worker
456*f6dc9357SAndroid Build Coastguard Worker return p;
457*f6dc9357SAndroid Build Coastguard Worker
458*f6dc9357SAndroid Build Coastguard Worker #endif
459*f6dc9357SAndroid Build Coastguard Worker }
460*f6dc9357SAndroid Build Coastguard Worker
461*f6dc9357SAndroid Build Coastguard Worker
z7_AlignedFree(void * address)462*f6dc9357SAndroid Build Coastguard Worker void z7_AlignedFree(void *address)
463*f6dc9357SAndroid Build Coastguard Worker {
464*f6dc9357SAndroid Build Coastguard Worker #ifndef USE_posix_memalign
465*f6dc9357SAndroid Build Coastguard Worker if (address)
466*f6dc9357SAndroid Build Coastguard Worker MyFree(((void **)address)[-1]);
467*f6dc9357SAndroid Build Coastguard Worker #else
468*f6dc9357SAndroid Build Coastguard Worker free(address);
469*f6dc9357SAndroid Build Coastguard Worker #endif
470*f6dc9357SAndroid Build Coastguard Worker }
471*f6dc9357SAndroid Build Coastguard Worker
472*f6dc9357SAndroid Build Coastguard Worker
SzAlignedAlloc(ISzAllocPtr pp,size_t size)473*f6dc9357SAndroid Build Coastguard Worker static void *SzAlignedAlloc(ISzAllocPtr pp, size_t size)
474*f6dc9357SAndroid Build Coastguard Worker {
475*f6dc9357SAndroid Build Coastguard Worker UNUSED_VAR(pp)
476*f6dc9357SAndroid Build Coastguard Worker return z7_AlignedAlloc(size);
477*f6dc9357SAndroid Build Coastguard Worker }
478*f6dc9357SAndroid Build Coastguard Worker
479*f6dc9357SAndroid Build Coastguard Worker
SzAlignedFree(ISzAllocPtr pp,void * address)480*f6dc9357SAndroid Build Coastguard Worker static void SzAlignedFree(ISzAllocPtr pp, void *address)
481*f6dc9357SAndroid Build Coastguard Worker {
482*f6dc9357SAndroid Build Coastguard Worker UNUSED_VAR(pp)
483*f6dc9357SAndroid Build Coastguard Worker #ifndef USE_posix_memalign
484*f6dc9357SAndroid Build Coastguard Worker if (address)
485*f6dc9357SAndroid Build Coastguard Worker MyFree(((void **)address)[-1]);
486*f6dc9357SAndroid Build Coastguard Worker #else
487*f6dc9357SAndroid Build Coastguard Worker free(address);
488*f6dc9357SAndroid Build Coastguard Worker #endif
489*f6dc9357SAndroid Build Coastguard Worker }
490*f6dc9357SAndroid Build Coastguard Worker
491*f6dc9357SAndroid Build Coastguard Worker
492*f6dc9357SAndroid Build Coastguard Worker const ISzAlloc g_AlignedAlloc = { SzAlignedAlloc, SzAlignedFree };
493*f6dc9357SAndroid Build Coastguard Worker
494*f6dc9357SAndroid Build Coastguard Worker
495*f6dc9357SAndroid Build Coastguard Worker
496*f6dc9357SAndroid Build Coastguard Worker /* we align ptr to support cases where CAlignOffsetAlloc::offset is not multiply of sizeof(void *) */
497*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ALLOC_NO_OFFSET_ALLOCATOR
498*f6dc9357SAndroid Build Coastguard Worker #if 1
499*f6dc9357SAndroid Build Coastguard Worker #define MY_ALIGN_PTR_DOWN_1(p) MY_ALIGN_PTR_DOWN(p, sizeof(void *))
500*f6dc9357SAndroid Build Coastguard Worker #define REAL_BLOCK_PTR_VAR(p) ((void **)MY_ALIGN_PTR_DOWN_1(p))[-1]
501*f6dc9357SAndroid Build Coastguard Worker #else
502*f6dc9357SAndroid Build Coastguard Worker // we can use this simplified code,
503*f6dc9357SAndroid Build Coastguard Worker // if (CAlignOffsetAlloc::offset == (k * sizeof(void *))
504*f6dc9357SAndroid Build Coastguard Worker #define REAL_BLOCK_PTR_VAR(p) (((void **)(p))[-1])
505*f6dc9357SAndroid Build Coastguard Worker #endif
506*f6dc9357SAndroid Build Coastguard Worker #endif
507*f6dc9357SAndroid Build Coastguard Worker
508*f6dc9357SAndroid Build Coastguard Worker
509*f6dc9357SAndroid Build Coastguard Worker #if 0
510*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ALLOC_NO_OFFSET_ALLOCATOR
511*f6dc9357SAndroid Build Coastguard Worker #include <stdio.h>
512*f6dc9357SAndroid Build Coastguard Worker static void PrintPtr(const char *s, const void *p)
513*f6dc9357SAndroid Build Coastguard Worker {
514*f6dc9357SAndroid Build Coastguard Worker const Byte *p2 = (const Byte *)&p;
515*f6dc9357SAndroid Build Coastguard Worker unsigned i;
516*f6dc9357SAndroid Build Coastguard Worker printf("%s %p ", s, p);
517*f6dc9357SAndroid Build Coastguard Worker for (i = sizeof(p); i != 0;)
518*f6dc9357SAndroid Build Coastguard Worker {
519*f6dc9357SAndroid Build Coastguard Worker i--;
520*f6dc9357SAndroid Build Coastguard Worker printf("%02x", p2[i]);
521*f6dc9357SAndroid Build Coastguard Worker }
522*f6dc9357SAndroid Build Coastguard Worker printf("\n");
523*f6dc9357SAndroid Build Coastguard Worker }
524*f6dc9357SAndroid Build Coastguard Worker #endif
525*f6dc9357SAndroid Build Coastguard Worker #endif
526*f6dc9357SAndroid Build Coastguard Worker
527*f6dc9357SAndroid Build Coastguard Worker
AlignOffsetAlloc_Alloc(ISzAllocPtr pp,size_t size)528*f6dc9357SAndroid Build Coastguard Worker static void *AlignOffsetAlloc_Alloc(ISzAllocPtr pp, size_t size)
529*f6dc9357SAndroid Build Coastguard Worker {
530*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_ALLOC_NO_OFFSET_ALLOCATOR)
531*f6dc9357SAndroid Build Coastguard Worker UNUSED_VAR(pp)
532*f6dc9357SAndroid Build Coastguard Worker return z7_AlignedAlloc(size);
533*f6dc9357SAndroid Build Coastguard Worker #else
534*f6dc9357SAndroid Build Coastguard Worker const CAlignOffsetAlloc *p = Z7_CONTAINER_FROM_VTBL_CONST(pp, CAlignOffsetAlloc, vt);
535*f6dc9357SAndroid Build Coastguard Worker void *adr;
536*f6dc9357SAndroid Build Coastguard Worker void *pAligned;
537*f6dc9357SAndroid Build Coastguard Worker size_t newSize;
538*f6dc9357SAndroid Build Coastguard Worker size_t extra;
539*f6dc9357SAndroid Build Coastguard Worker size_t alignSize = (size_t)1 << p->numAlignBits;
540*f6dc9357SAndroid Build Coastguard Worker
541*f6dc9357SAndroid Build Coastguard Worker if (alignSize < sizeof(void *))
542*f6dc9357SAndroid Build Coastguard Worker alignSize = sizeof(void *);
543*f6dc9357SAndroid Build Coastguard Worker
544*f6dc9357SAndroid Build Coastguard Worker if (p->offset >= alignSize)
545*f6dc9357SAndroid Build Coastguard Worker return NULL;
546*f6dc9357SAndroid Build Coastguard Worker
547*f6dc9357SAndroid Build Coastguard Worker /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned
548*f6dc9357SAndroid Build Coastguard Worker block to prevent cache line sharing with another allocated blocks */
549*f6dc9357SAndroid Build Coastguard Worker extra = p->offset & (sizeof(void *) - 1);
550*f6dc9357SAndroid Build Coastguard Worker newSize = size + alignSize + extra + ADJUST_ALLOC_SIZE;
551*f6dc9357SAndroid Build Coastguard Worker if (newSize < size)
552*f6dc9357SAndroid Build Coastguard Worker return NULL;
553*f6dc9357SAndroid Build Coastguard Worker
554*f6dc9357SAndroid Build Coastguard Worker adr = ISzAlloc_Alloc(p->baseAlloc, newSize);
555*f6dc9357SAndroid Build Coastguard Worker
556*f6dc9357SAndroid Build Coastguard Worker if (!adr)
557*f6dc9357SAndroid Build Coastguard Worker return NULL;
558*f6dc9357SAndroid Build Coastguard Worker
559*f6dc9357SAndroid Build Coastguard Worker pAligned = (char *)MY_ALIGN_PTR_DOWN((char *)adr +
560*f6dc9357SAndroid Build Coastguard Worker alignSize - p->offset + extra + ADJUST_ALLOC_SIZE, alignSize) + p->offset;
561*f6dc9357SAndroid Build Coastguard Worker
562*f6dc9357SAndroid Build Coastguard Worker #if 0
563*f6dc9357SAndroid Build Coastguard Worker printf("\nalignSize = %6x, offset=%6x, size=%8x \n", (unsigned)alignSize, (unsigned)p->offset, (unsigned)size);
564*f6dc9357SAndroid Build Coastguard Worker PrintPtr("base", adr);
565*f6dc9357SAndroid Build Coastguard Worker PrintPtr("alig", pAligned);
566*f6dc9357SAndroid Build Coastguard Worker #endif
567*f6dc9357SAndroid Build Coastguard Worker
568*f6dc9357SAndroid Build Coastguard Worker PrintLn();
569*f6dc9357SAndroid Build Coastguard Worker Print("- Aligned: ");
570*f6dc9357SAndroid Build Coastguard Worker Print(" size="); PrintHex(size, 8);
571*f6dc9357SAndroid Build Coastguard Worker Print(" a_size="); PrintHex(newSize, 8);
572*f6dc9357SAndroid Build Coastguard Worker Print(" ptr="); PrintAddr(adr);
573*f6dc9357SAndroid Build Coastguard Worker Print(" a_ptr="); PrintAddr(pAligned);
574*f6dc9357SAndroid Build Coastguard Worker PrintLn();
575*f6dc9357SAndroid Build Coastguard Worker
576*f6dc9357SAndroid Build Coastguard Worker REAL_BLOCK_PTR_VAR(pAligned) = adr;
577*f6dc9357SAndroid Build Coastguard Worker
578*f6dc9357SAndroid Build Coastguard Worker return pAligned;
579*f6dc9357SAndroid Build Coastguard Worker #endif
580*f6dc9357SAndroid Build Coastguard Worker }
581*f6dc9357SAndroid Build Coastguard Worker
582*f6dc9357SAndroid Build Coastguard Worker
AlignOffsetAlloc_Free(ISzAllocPtr pp,void * address)583*f6dc9357SAndroid Build Coastguard Worker static void AlignOffsetAlloc_Free(ISzAllocPtr pp, void *address)
584*f6dc9357SAndroid Build Coastguard Worker {
585*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_ALLOC_NO_OFFSET_ALLOCATOR)
586*f6dc9357SAndroid Build Coastguard Worker UNUSED_VAR(pp)
587*f6dc9357SAndroid Build Coastguard Worker z7_AlignedFree(address);
588*f6dc9357SAndroid Build Coastguard Worker #else
589*f6dc9357SAndroid Build Coastguard Worker if (address)
590*f6dc9357SAndroid Build Coastguard Worker {
591*f6dc9357SAndroid Build Coastguard Worker const CAlignOffsetAlloc *p = Z7_CONTAINER_FROM_VTBL_CONST(pp, CAlignOffsetAlloc, vt);
592*f6dc9357SAndroid Build Coastguard Worker PrintLn();
593*f6dc9357SAndroid Build Coastguard Worker Print("- Aligned Free: ");
594*f6dc9357SAndroid Build Coastguard Worker PrintLn();
595*f6dc9357SAndroid Build Coastguard Worker ISzAlloc_Free(p->baseAlloc, REAL_BLOCK_PTR_VAR(address));
596*f6dc9357SAndroid Build Coastguard Worker }
597*f6dc9357SAndroid Build Coastguard Worker #endif
598*f6dc9357SAndroid Build Coastguard Worker }
599*f6dc9357SAndroid Build Coastguard Worker
600*f6dc9357SAndroid Build Coastguard Worker
AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc * p)601*f6dc9357SAndroid Build Coastguard Worker void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p)
602*f6dc9357SAndroid Build Coastguard Worker {
603*f6dc9357SAndroid Build Coastguard Worker p->vt.Alloc = AlignOffsetAlloc_Alloc;
604*f6dc9357SAndroid Build Coastguard Worker p->vt.Free = AlignOffsetAlloc_Free;
605*f6dc9357SAndroid Build Coastguard Worker }
606