1*8a62a2a5SMartin Matuska // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-only
2*8a62a2a5SMartin Matuska /*
3*8a62a2a5SMartin Matuska * Copyright (c) Meta Platforms, Inc. and affiliates.
4*8a62a2a5SMartin Matuska * All rights reserved.
5*8a62a2a5SMartin Matuska *
6*8a62a2a5SMartin Matuska * This source code is licensed under both the BSD-style license (found in the
7*8a62a2a5SMartin Matuska * LICENSE file in the root directory of this source tree) and the GPLv2 (found
8*8a62a2a5SMartin Matuska * in the COPYING file in the root directory of this source tree).
9*8a62a2a5SMartin Matuska * You may select, at your option, one of the above-listed licenses.
10*8a62a2a5SMartin Matuska */
11*8a62a2a5SMartin Matuska
12*8a62a2a5SMartin Matuska /* This file provides custom allocation primitives
13*8a62a2a5SMartin Matuska */
14*8a62a2a5SMartin Matuska
15*8a62a2a5SMartin Matuska #define ZSTD_DEPS_NEED_MALLOC
16*8a62a2a5SMartin Matuska #include "zstd_deps.h" /* ZSTD_malloc, ZSTD_calloc, ZSTD_free, ZSTD_memset */
17*8a62a2a5SMartin Matuska
18*8a62a2a5SMartin Matuska #include "compiler.h" /* MEM_STATIC */
19*8a62a2a5SMartin Matuska #define ZSTD_STATIC_LINKING_ONLY
20*8a62a2a5SMartin Matuska #include "../zstd.h" /* ZSTD_customMem */
21*8a62a2a5SMartin Matuska
22*8a62a2a5SMartin Matuska #ifndef ZSTD_ALLOCATIONS_H
23*8a62a2a5SMartin Matuska #define ZSTD_ALLOCATIONS_H
24*8a62a2a5SMartin Matuska
25*8a62a2a5SMartin Matuska /* custom memory allocation functions */
26*8a62a2a5SMartin Matuska
ZSTD_customMalloc(size_t size,ZSTD_customMem customMem)27*8a62a2a5SMartin Matuska MEM_STATIC void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem)
28*8a62a2a5SMartin Matuska {
29*8a62a2a5SMartin Matuska if (customMem.customAlloc)
30*8a62a2a5SMartin Matuska return customMem.customAlloc(customMem.opaque, size);
31*8a62a2a5SMartin Matuska return ZSTD_malloc(size);
32*8a62a2a5SMartin Matuska }
33*8a62a2a5SMartin Matuska
ZSTD_customCalloc(size_t size,ZSTD_customMem customMem)34*8a62a2a5SMartin Matuska MEM_STATIC void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem)
35*8a62a2a5SMartin Matuska {
36*8a62a2a5SMartin Matuska if (customMem.customAlloc) {
37*8a62a2a5SMartin Matuska /* calloc implemented as malloc+memset;
38*8a62a2a5SMartin Matuska * not as efficient as calloc, but next best guess for custom malloc */
39*8a62a2a5SMartin Matuska void* const ptr = customMem.customAlloc(customMem.opaque, size);
40*8a62a2a5SMartin Matuska ZSTD_memset(ptr, 0, size);
41*8a62a2a5SMartin Matuska return ptr;
42*8a62a2a5SMartin Matuska }
43*8a62a2a5SMartin Matuska return ZSTD_calloc(1, size);
44*8a62a2a5SMartin Matuska }
45*8a62a2a5SMartin Matuska
ZSTD_customFree(void * ptr,ZSTD_customMem customMem)46*8a62a2a5SMartin Matuska MEM_STATIC void ZSTD_customFree(void* ptr, ZSTD_customMem customMem)
47*8a62a2a5SMartin Matuska {
48*8a62a2a5SMartin Matuska if (ptr!=NULL) {
49*8a62a2a5SMartin Matuska if (customMem.customFree)
50*8a62a2a5SMartin Matuska customMem.customFree(customMem.opaque, ptr);
51*8a62a2a5SMartin Matuska else
52*8a62a2a5SMartin Matuska ZSTD_free(ptr);
53*8a62a2a5SMartin Matuska }
54*8a62a2a5SMartin Matuska }
55*8a62a2a5SMartin Matuska
56*8a62a2a5SMartin Matuska #endif /* ZSTD_ALLOCATIONS_H */
57