1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2019 Google LLC
2*4bdc9457SAndroid Build Coastguard Worker //
3*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
4*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
5*4bdc9457SAndroid Build Coastguard Worker
6*4bdc9457SAndroid Build Coastguard Worker #include <assert.h>
7*4bdc9457SAndroid Build Coastguard Worker #include <stddef.h>
8*4bdc9457SAndroid Build Coastguard Worker #include <stdlib.h>
9*4bdc9457SAndroid Build Coastguard Worker #ifdef __ANDROID__
10*4bdc9457SAndroid Build Coastguard Worker #include <malloc.h>
11*4bdc9457SAndroid Build Coastguard Worker #endif
12*4bdc9457SAndroid Build Coastguard Worker
13*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/allocator.h>
14*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/common.h>
15*4bdc9457SAndroid Build Coastguard Worker
16*4bdc9457SAndroid Build Coastguard Worker
17*4bdc9457SAndroid Build Coastguard Worker extern int posix_memalign(void **memptr, size_t alignment, size_t size);
18*4bdc9457SAndroid Build Coastguard Worker
19*4bdc9457SAndroid Build Coastguard Worker
xnn_allocate(void * context,size_t size)20*4bdc9457SAndroid Build Coastguard Worker static void* xnn_allocate(void* context, size_t size) {
21*4bdc9457SAndroid Build Coastguard Worker return malloc(size);
22*4bdc9457SAndroid Build Coastguard Worker }
23*4bdc9457SAndroid Build Coastguard Worker
xnn_reallocate(void * context,void * pointer,size_t size)24*4bdc9457SAndroid Build Coastguard Worker static void* xnn_reallocate(void* context, void* pointer, size_t size) {
25*4bdc9457SAndroid Build Coastguard Worker return realloc(pointer, size);
26*4bdc9457SAndroid Build Coastguard Worker }
27*4bdc9457SAndroid Build Coastguard Worker
xnn_deallocate(void * context,void * pointer)28*4bdc9457SAndroid Build Coastguard Worker static void xnn_deallocate(void* context, void* pointer) {
29*4bdc9457SAndroid Build Coastguard Worker if XNN_LIKELY(pointer != NULL) {
30*4bdc9457SAndroid Build Coastguard Worker free(pointer);
31*4bdc9457SAndroid Build Coastguard Worker }
32*4bdc9457SAndroid Build Coastguard Worker }
33*4bdc9457SAndroid Build Coastguard Worker
xnn_aligned_allocate(void * context,size_t alignment,size_t size)34*4bdc9457SAndroid Build Coastguard Worker static void* xnn_aligned_allocate(void* context, size_t alignment, size_t size) {
35*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_WASM
36*4bdc9457SAndroid Build Coastguard Worker assert(alignment <= 2 * sizeof(void*));
37*4bdc9457SAndroid Build Coastguard Worker return malloc(size);
38*4bdc9457SAndroid Build Coastguard Worker #elif XNN_PLATFORM_ANDROID
39*4bdc9457SAndroid Build Coastguard Worker return memalign(alignment, size);
40*4bdc9457SAndroid Build Coastguard Worker #elif XNN_PLATFORM_WINDOWS
41*4bdc9457SAndroid Build Coastguard Worker return _aligned_malloc(size, alignment);
42*4bdc9457SAndroid Build Coastguard Worker #else
43*4bdc9457SAndroid Build Coastguard Worker void* memory_ptr = NULL;
44*4bdc9457SAndroid Build Coastguard Worker if (posix_memalign(&memory_ptr, alignment, size) != 0) {
45*4bdc9457SAndroid Build Coastguard Worker return NULL;
46*4bdc9457SAndroid Build Coastguard Worker }
47*4bdc9457SAndroid Build Coastguard Worker return memory_ptr;
48*4bdc9457SAndroid Build Coastguard Worker #endif
49*4bdc9457SAndroid Build Coastguard Worker }
50*4bdc9457SAndroid Build Coastguard Worker
xnn_aligned_deallocate(void * context,void * pointer)51*4bdc9457SAndroid Build Coastguard Worker static void xnn_aligned_deallocate(void* context, void* pointer) {
52*4bdc9457SAndroid Build Coastguard Worker if XNN_LIKELY(pointer != NULL) {
53*4bdc9457SAndroid Build Coastguard Worker #if defined(_WIN32)
54*4bdc9457SAndroid Build Coastguard Worker _aligned_free(pointer);
55*4bdc9457SAndroid Build Coastguard Worker #else
56*4bdc9457SAndroid Build Coastguard Worker free(pointer);
57*4bdc9457SAndroid Build Coastguard Worker #endif
58*4bdc9457SAndroid Build Coastguard Worker }
59*4bdc9457SAndroid Build Coastguard Worker }
60*4bdc9457SAndroid Build Coastguard Worker
61*4bdc9457SAndroid Build Coastguard Worker const struct xnn_allocator xnn_default_allocator = {
62*4bdc9457SAndroid Build Coastguard Worker .allocate = xnn_allocate,
63*4bdc9457SAndroid Build Coastguard Worker .reallocate = xnn_reallocate,
64*4bdc9457SAndroid Build Coastguard Worker .deallocate = xnn_deallocate,
65*4bdc9457SAndroid Build Coastguard Worker .aligned_allocate = xnn_aligned_allocate,
66*4bdc9457SAndroid Build Coastguard Worker .aligned_deallocate = xnn_aligned_deallocate,
67*4bdc9457SAndroid Build Coastguard Worker };
68