// Copyright 2016 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.

#ifndef FBL_SLAB_MALLOC_H_
#define FBL_SLAB_MALLOC_H_
#include <stdlib.h>

namespace fbl {
namespace internal {

// TODO(johngro): Explore options for making this better.
//
// Making the kernel/user-mode decision here using an #ifdef and having two
// different implementations here feels a bit ugly.  Making the allocation
// behavior a template parameter is an option, but seems like a waste since
// user-mode will probably have no reason to allocate with anything other than
// malloc/free, while the kernel will *always* use the one kernel-approved
// method for allocating slabs.
//
// One option might be to push all the slab allocation code into a private file
// (slab_allocator_priv.h?) and have an outer include file available only to
// user mode which defines the SlabMalloc struct, and a different one in the
// kernel director which defines the kernel's SlabMalloc struct.
#ifdef _KERNEL

struct SlabMalloc {
  // TODO(johngro): Replace this implementation with a kernel implementation
  // which does not use the heap.
  static void* Allocate(size_t amt, size_t align) {
    void* mem = ::malloc(amt);
    ZX_DEBUG_ASSERT((reinterpret_cast<uintptr_t>(mem) % align) == 0);
    return mem;
  }

  static void Free(void* ptr) { ::free(ptr); }
};

#else

struct SlabMalloc {
  // TODO(johngro): Replace this implementation with a kernel implementation
  // which does not use the heap.
  static void* Allocate(size_t amt, size_t align) { return ::aligned_alloc(align, amt); }

  static void Free(void* ptr) { ::free(ptr); }
};

#endif

}  // namespace internal
}  // namespace fbl

#endif  // FBL_SLAB_MALLOC_H_
