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