1 // 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
13 #include <xnnpack/allocator.h>
14 #include <xnnpack/common.h>
15
16
17 extern int posix_memalign(void **memptr, size_t alignment, size_t size);
18
19
xnn_allocate(void * context,size_t size)20 static void* xnn_allocate(void* context, size_t size) {
21 return malloc(size);
22 }
23
xnn_reallocate(void * context,void * pointer,size_t size)24 static void* xnn_reallocate(void* context, void* pointer, size_t size) {
25 return realloc(pointer, size);
26 }
27
xnn_deallocate(void * context,void * pointer)28 static void xnn_deallocate(void* context, void* pointer) {
29 if XNN_LIKELY(pointer != NULL) {
30 free(pointer);
31 }
32 }
33
xnn_aligned_allocate(void * context,size_t alignment,size_t size)34 static void* xnn_aligned_allocate(void* context, size_t alignment, size_t size) {
35 #if XNN_ARCH_WASM
36 assert(alignment <= 2 * sizeof(void*));
37 return malloc(size);
38 #elif XNN_PLATFORM_ANDROID
39 return memalign(alignment, size);
40 #elif XNN_PLATFORM_WINDOWS
41 return _aligned_malloc(size, alignment);
42 #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
xnn_aligned_deallocate(void * context,void * pointer)51 static void xnn_aligned_deallocate(void* context, void* pointer) {
52 if XNN_LIKELY(pointer != NULL) {
53 #if defined(_WIN32)
54 _aligned_free(pointer);
55 #else
56 free(pointer);
57 #endif
58 }
59 }
60
61 const 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 };
68