| // 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_ |