// Copyright 2019 Google LLC
//
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree.

#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#ifdef __ANDROID__
  #include <malloc.h>
#endif

#include <xnnpack/allocator.h>
#include <xnnpack/common.h>


extern int posix_memalign(void **memptr, size_t alignment, size_t size);


static void* xnn_allocate(void* context, size_t size) {
  return malloc(size);
}

static void* xnn_reallocate(void* context, void* pointer, size_t size) {
  return realloc(pointer, size);
}

static void xnn_deallocate(void* context, void* pointer) {
  if XNN_LIKELY(pointer != NULL) {
    free(pointer);
  }
}

static void* xnn_aligned_allocate(void* context, size_t alignment, size_t size) {
#if XNN_ARCH_WASM
  assert(alignment <= 2 * sizeof(void*));
  return malloc(size);
#elif defined(__ANDROID__)
  return memalign(alignment, size);
#elif defined(_WIN32)
  return _aligned_malloc(size, alignment);
#else
  void* memory_ptr = NULL;
  if (posix_memalign(&memory_ptr, alignment, size) != 0) {
    return NULL;
  }
  return memory_ptr;
#endif
}

static void xnn_aligned_deallocate(void* context, void* pointer) {
  if XNN_LIKELY(pointer != NULL) {
    #if defined(_WIN32)
      _aligned_free(pointer);
    #else
      free(pointer);
    #endif
  }
}

const struct xnn_allocator xnn_default_allocator = {
  .allocate = xnn_allocate,
  .reallocate = xnn_reallocate,
  .deallocate = xnn_deallocate,
  .aligned_allocate = xnn_aligned_allocate,
  .aligned_deallocate = xnn_aligned_deallocate,
};
