xref: /freebsd/sys/contrib/openzfs/module/zstd/lib/common/allocations.h (revision 8a62a2a5659d1839d8799b4274c04469d7f17c78)
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