zstd_common.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // SPDX-License-Identifier: (GPL-2.0 or BSD-3-Clause-Clear)
  2. /**
  3. * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
  4. * All rights reserved.
  5. */
  6. /*-*************************************
  7. * Dependencies
  8. ***************************************/
  9. #include "error_private.h"
  10. #include "zstd_internal.h" /* declaration of ZSTD_isError, ZSTD_getErrorName, ZSTD_getErrorCode, ZSTD_getErrorString, ZSTD_versionNumber */
  11. #include <malloc.h>
  12. #include <linux/kernel.h>
  13. /*=**************************************************************
  14. * Custom allocator
  15. ****************************************************************/
  16. #define stack_push(stack, size) \
  17. ({ \
  18. void *const ptr = ZSTD_PTR_ALIGN((stack)->ptr); \
  19. (stack)->ptr = (char *)ptr + (size); \
  20. (stack)->ptr <= (stack)->end ? ptr : NULL; \
  21. })
  22. ZSTD_customMem ZSTD_initStack(void *workspace, size_t workspaceSize)
  23. {
  24. ZSTD_customMem stackMem = {ZSTD_stackAlloc, ZSTD_stackFree, workspace};
  25. ZSTD_stack *stack = (ZSTD_stack *)workspace;
  26. /* Verify preconditions */
  27. if (!workspace || workspaceSize < sizeof(ZSTD_stack) || workspace != ZSTD_PTR_ALIGN(workspace)) {
  28. ZSTD_customMem error = {NULL, NULL, NULL};
  29. return error;
  30. }
  31. /* Initialize the stack */
  32. stack->ptr = workspace;
  33. stack->end = (char *)workspace + workspaceSize;
  34. stack_push(stack, sizeof(ZSTD_stack));
  35. return stackMem;
  36. }
  37. void *ZSTD_stackAllocAll(void *opaque, size_t *size)
  38. {
  39. ZSTD_stack *stack = (ZSTD_stack *)opaque;
  40. *size = (BYTE const *)stack->end - (BYTE *)ZSTD_PTR_ALIGN(stack->ptr);
  41. return stack_push(stack, *size);
  42. }
  43. void *ZSTD_stackAlloc(void *opaque, size_t size)
  44. {
  45. ZSTD_stack *stack = (ZSTD_stack *)opaque;
  46. return stack_push(stack, size);
  47. }
  48. void ZSTD_stackFree(void *opaque, void *address)
  49. {
  50. (void)opaque;
  51. (void)address;
  52. }
  53. void *ZSTD_malloc(size_t size, ZSTD_customMem customMem) { return customMem.customAlloc(customMem.opaque, size); }
  54. void ZSTD_free(void *ptr, ZSTD_customMem customMem)
  55. {
  56. if (ptr != NULL)
  57. customMem.customFree(customMem.opaque, ptr);
  58. }