Merge pull request #26 from gendx/no-spin-allocator
Don't lock the allocator with spin.
This commit is contained in:
77
patches/libtock-rs/06-no_spin_allocator.patch
Normal file
77
patches/libtock-rs/06-no_spin_allocator.patch
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
diff --git a/Cargo.toml b/Cargo.toml
|
||||||
|
index 844e424..386a9ed 100644
|
||||||
|
--- a/Cargo.toml
|
||||||
|
+++ b/Cargo.toml
|
||||||
|
@@ -6,7 +6,7 @@ license = "MIT/Apache-2.0"
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
-linked_list_allocator = "0.6.6"
|
||||||
|
+linked_list_allocator = { version = "0.6.6", default-features = false }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
panic_console = []
|
||||||
|
diff --git a/src/entry_point.rs b/src/entry_point.rs
|
||||||
|
index 15e1d03..2fe5c40 100644
|
||||||
|
--- a/src/entry_point.rs
|
||||||
|
+++ b/src/entry_point.rs
|
||||||
|
@@ -1,8 +1,10 @@
|
||||||
|
use crate::memop;
|
||||||
|
use crate::syscalls;
|
||||||
|
-use crate::ALLOCATOR;
|
||||||
|
+use core::alloc::{GlobalAlloc, Layout};
|
||||||
|
use core::intrinsics;
|
||||||
|
use core::ptr;
|
||||||
|
+use core::ptr::NonNull;
|
||||||
|
+use linked_list_allocator::Heap;
|
||||||
|
|
||||||
|
// _start and rust_start are the first two procedures executed when a Tock
|
||||||
|
// application starts. _start is invoked directly by the Tock kernel; it
|
||||||
|
@@ -357,7 +359,7 @@ pub unsafe extern "C" fn rust_start(app_start: usize, stacktop: usize, app_heap_
|
||||||
|
// Tell the kernel the new app heap break.
|
||||||
|
memop::set_brk(app_heap_end as *const u8);
|
||||||
|
|
||||||
|
- ALLOCATOR.lock().init(app_heap_start, HEAP_SIZE);
|
||||||
|
+ HEAP.init(app_heap_start, HEAP_SIZE);
|
||||||
|
|
||||||
|
main(0, ptr::null());
|
||||||
|
|
||||||
|
@@ -365,3 +367,23 @@ pub unsafe extern "C" fn rust_start(app_start: usize, stacktop: usize, app_heap_
|
||||||
|
syscalls::yieldk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+#[cfg(any(target_arch = "arm", target_arch = "riscv32"))]
|
||||||
|
+#[global_allocator]
|
||||||
|
+static ALLOCATOR: TockAllocator = TockAllocator;
|
||||||
|
+
|
||||||
|
+static mut HEAP: Heap = Heap::empty();
|
||||||
|
+
|
||||||
|
+struct TockAllocator;
|
||||||
|
+
|
||||||
|
+unsafe impl GlobalAlloc for TockAllocator {
|
||||||
|
+ unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
|
||||||
|
+ HEAP.allocate_first_fit(layout)
|
||||||
|
+ .ok()
|
||||||
|
+ .map_or(0 as *mut u8, |allocation| allocation.as_ptr())
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
|
||||||
|
+ HEAP.deallocate(NonNull::new_unchecked(ptr), layout)
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
diff --git a/src/lib.rs b/src/lib.rs
|
||||||
|
index c9001bf..2f9c1c0 100644
|
||||||
|
--- a/src/lib.rs
|
||||||
|
+++ b/src/lib.rs
|
||||||
|
@@ -44,10 +44,6 @@ pub mod syscalls;
|
||||||
|
#[path = "syscalls_mock.rs"]
|
||||||
|
pub mod syscalls;
|
||||||
|
|
||||||
|
-#[cfg(any(target_arch = "arm", target_arch = "riscv32"))]
|
||||||
|
-#[global_allocator]
|
||||||
|
-static ALLOCATOR: linked_list_allocator::LockedHeap = linked_list_allocator::LockedHeap::empty();
|
||||||
|
-
|
||||||
|
// Dummy structure to force importing the panic_handler and other no_std elements when nothing else
|
||||||
|
// is imported.
|
||||||
|
pub struct LibTock;
|
||||||
Reference in New Issue
Block a user