#![feature(alloc)]
#![feature(allocator_api)]
#![feature(const_fn)]
#![no_std]
extern crate alloc;
extern crate cortex_m;
extern crate linked_list_allocator;
use core::alloc::{GlobalAlloc, Layout, Opaque};
use core::ptr::NonNull;
use cortex_m::interrupt::Mutex;
use linked_list_allocator::Heap;
pub struct CortexMHeap {
heap: Mutex<Heap>,
}
impl CortexMHeap {
pub const fn empty() -> CortexMHeap {
CortexMHeap {
heap: Mutex::new(Heap::empty()),
}
}
pub unsafe fn init(&self, start_addr: usize, size: usize) {
self.heap.lock(|heap| heap.init(start_addr, size));
}
}
unsafe impl GlobalAlloc for CortexMHeap {
unsafe fn alloc(&self, layout: Layout) -> *mut Opaque {
self.heap
.lock(|heap| heap.allocate_first_fit(layout))
.ok()
.map_or(0 as *mut Opaque, |allocation| allocation.as_ptr())
}
unsafe fn dealloc(&self, ptr: *mut Opaque, layout: Layout) {
self.heap
.lock(|heap| heap.deallocate(NonNull::new_unchecked(ptr), layout));
}
}