// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

//
//
//

#include <assert.h>
#include <stdlib.h>

//
//
//

#include "allocator_host.h"

//
//
//

#if defined(_MSC_VER)

#define SPN_ALIGNED_ALLOC(alignment, size) _aligned_malloc(size, alignment)
#define SPN_ALIGNED_FREE(p) _aligned_free(p)

#elif defined(__ANDROID__)

#define SPN_ALIGNED_ALLOC(alignment, size) memalign(alignment, size)
#define SPN_ALIGNED_FREE(p) free(p)

#else

#define SPN_ALIGNED_ALLOC(alignment, size) aligned_alloc(alignment, size)
#define SPN_ALIGNED_FREE(p) free(p)

#endif

//
// PERM
//

#ifndef NDEBUG

#include <stdbool.h>

bool
is_pow2_u64(uint64_t n)
{
  return (n & (n - 1)) == 0;
}

#endif

void
spn_allocator_host_perm_create(struct spn_allocator_host_perm * const host_perm,
                               uint64_t const                         alignment)
{
  assert(is_pow2_u64(alignment));

  host_perm->alignment = alignment;
}

void
spn_allocator_host_perm_dispose(struct spn_allocator_host_perm * const host_perm)
{
  ;
}

void *
spn_allocator_host_perm_alloc(struct spn_allocator_host_perm * const host_perm,
                              spn_mem_flags_e const                  flags,
                              uint64_t const                         size)
{
  uint64_t const mask    = host_perm->alignment - 1;
  uint64_t const size_ru = (size + mask) & ~mask;

  return SPN_ALIGNED_ALLOC(host_perm->alignment, size_ru);
}

void
spn_allocator_host_perm_free(struct spn_allocator_host_perm * const host_perm, void * const mem)
{
  SPN_ALIGNED_FREE(mem);
}

//
// TEMP
//

void
spn_allocator_host_temp_create(struct spn_allocator_host_temp * const host_temp,
                               struct spn_allocator_host_perm * const host_perm,
                               uint32_t const                         subbufs,
                               uint64_t const                         size,
                               uint64_t const                         alignment)
{
  // round it up
  uint64_t const mask    = alignment - 1;
  uint64_t const size_ru = (size + mask) & ~mask;

  host_temp->host_perm = host_perm;

  host_temp->extent = spn_allocator_host_perm_alloc(host_perm, SPN_MEM_FLAGS_READ_WRITE, size_ru);
  spn_suballocator_create(&host_temp->suballocator,
                          host_perm,
                          "HOST ",
                          subbufs,
                          size_ru,
                          alignment);
}

void
spn_allocator_host_temp_dispose(struct spn_allocator_host_temp * const host_temp)
{
  spn_suballocator_dispose(&host_temp->suballocator, host_temp->host_perm);

  spn_allocator_host_perm_free(host_temp->host_perm, host_temp->extent);
}

void *
spn_allocator_host_temp_alloc(struct spn_allocator_host_temp * const host_temp,
                              struct spn_device * const              device,
                              spn_suballocator_wait_pfn              wait,
                              spn_mem_flags_e const                  flags,
                              uint64_t const                         size,
                              spn_subbuf_id_t * const                subbuf_id,
                              uint64_t * const                       subbuf_size)
{
  if (size == 0)
    {
      *subbuf_id = (spn_subbuf_id_t)-1;

      if (subbuf_size != NULL)
        *subbuf_size = 0;

      return NULL;
    }

  uint64_t subbuf_origin;

  spn_suballocator_subbuf_alloc(&host_temp->suballocator,
                                device,
                                wait,
                                size,
                                subbuf_id,
                                &subbuf_origin,
                                subbuf_size);

  return host_temp->extent + (spn_subbuf_size_t)subbuf_origin;
}

void
spn_allocator_host_temp_free(struct spn_allocator_host_temp * const host_temp,
                             spn_subbuf_id_t const                  subbuf_id)
{
  spn_suballocator_subbuf_free(&host_temp->suballocator, subbuf_id);
}

//
//
//
