xref: /linux/lib/zstd/common/allocations.h (revision e61f33273ca755b3e2ebee4520a76097199dc7a8)
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