blob: c28b6701cbbc770494839b329ede5ba4c7145eea [file] [log] [blame]
Marat Dukhan04f03be2019-11-19 12:36:47 -08001// Copyright 2019 Google LLC
2//
3// This source code is licensed under the BSD-style license found in the
4// LICENSE file in the root directory of this source tree.
5
6#include <assert.h>
7#include <stddef.h>
8#include <stdlib.h>
9#ifdef __ANDROID__
10 #include <malloc.h>
11#endif
12
Marat Dukhan496389f2021-04-07 15:47:12 -070013#include <xnnpack/allocator.h>
Marat Dukhan04f03be2019-11-19 12:36:47 -080014#include <xnnpack/common.h>
Marat Dukhan04f03be2019-11-19 12:36:47 -080015
16
17extern int posix_memalign(void **memptr, size_t alignment, size_t size);
18
19
Marat Dukhan496389f2021-04-07 15:47:12 -070020static void* xnn_allocate(void* context, size_t size) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080021 return malloc(size);
22}
23
Marat Dukhan496389f2021-04-07 15:47:12 -070024static void* xnn_reallocate(void* context, void* pointer, size_t size) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080025 return realloc(pointer, size);
26}
27
Marat Dukhan496389f2021-04-07 15:47:12 -070028static void xnn_deallocate(void* context, void* pointer) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080029 if XNN_LIKELY(pointer != NULL) {
30 free(pointer);
31 }
32}
33
Marat Dukhan496389f2021-04-07 15:47:12 -070034static void* xnn_aligned_allocate(void* context, size_t alignment, size_t size) {
Marat Dukhana199d492020-07-24 15:01:25 -070035#if XNN_ARCH_WASM
Marat Dukhan04f03be2019-11-19 12:36:47 -080036 assert(alignment <= 2 * sizeof(void*));
37 return malloc(size);
Zhi An Ng0db15d32021-12-10 16:45:06 -080038#elif XNN_PLATFORM_ANDROID
Marat Dukhan04f03be2019-11-19 12:36:47 -080039 return memalign(alignment, size);
Zhi An Ng0db15d32021-12-10 16:45:06 -080040#elif XNN_PLATFORM_WINDOWS
Yasuhiro Matsumoto462be052020-02-29 13:41:14 +090041 return _aligned_malloc(size, alignment);
Marat Dukhan04f03be2019-11-19 12:36:47 -080042#else
43 void* memory_ptr = NULL;
44 if (posix_memalign(&memory_ptr, alignment, size) != 0) {
45 return NULL;
46 }
47 return memory_ptr;
48#endif
49}
50
Marat Dukhan496389f2021-04-07 15:47:12 -070051static void xnn_aligned_deallocate(void* context, void* pointer) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080052 if XNN_LIKELY(pointer != NULL) {
Marat Dukhan504f5942020-04-13 01:07:08 -070053 #if defined(_WIN32)
54 _aligned_free(pointer);
55 #else
56 free(pointer);
57 #endif
Marat Dukhan04f03be2019-11-19 12:36:47 -080058 }
59}
Marat Dukhan496389f2021-04-07 15:47:12 -070060
61const struct xnn_allocator xnn_default_allocator = {
62 .allocate = xnn_allocate,
63 .reallocate = xnn_reallocate,
64 .deallocate = xnn_deallocate,
65 .aligned_allocate = xnn_aligned_allocate,
66 .aligned_deallocate = xnn_aligned_deallocate,
67};