@@ -7,7 +7,7 @@ use linked_list_allocator::Heap as LLHeap;
77
88/// A linked list first fit heap.
99pub struct Heap {
10- heap : Mutex < RefCell < LLHeap > > ,
10+ heap : Mutex < RefCell < ( LLHeap , bool ) > > ,
1111}
1212
1313impl Heap {
@@ -17,7 +17,7 @@ impl Heap {
1717 /// [`init`](Self::init) method before using the allocator.
1818 pub const fn empty ( ) -> Heap {
1919 Heap {
20- heap : Mutex :: new ( RefCell :: new ( LLHeap :: empty ( ) ) ) ,
20+ heap : Mutex :: new ( RefCell :: new ( ( LLHeap :: empty ( ) , false ) ) ) ,
2121 }
2222 }
2323
@@ -41,34 +41,42 @@ impl Heap {
4141 ///
4242 /// # Safety
4343 ///
44- /// Obey these or Bad Stuff will happen.
44+ /// This function is safe if the following invariants hold:
4545 ///
46- /// - This function must be called exactly ONCE.
47- /// - `size > 0`
46+ /// - `start_addr` points to valid memory.
47+ /// - `size` is correct.
48+ ///
49+ /// # Panics
50+ ///
51+ /// This function will panic if either of the following are true:
52+ ///
53+ /// - this function is called more than ONCE.
54+ /// - `size == 0`.
4855 pub unsafe fn init ( & self , start_addr : usize , size : usize ) {
56+ assert ! ( size > 0 ) ;
4957 critical_section:: with ( |cs| {
50- self . heap
51- . borrow ( cs )
52- . borrow_mut ( )
53- . init ( start_addr as * mut u8 , size) ;
58+ let mut heap = self . heap . borrow_ref_mut ( cs ) ;
59+ assert ! ( !heap . 1 ) ;
60+ heap . 1 = true ;
61+ heap . 0 . init ( start_addr as * mut u8 , size) ;
5462 } ) ;
5563 }
5664
5765 /// Returns an estimate of the amount of bytes in use.
5866 pub fn used ( & self ) -> usize {
59- critical_section:: with ( |cs| self . heap . borrow ( cs) . borrow_mut ( ) . used ( ) )
67+ critical_section:: with ( |cs| self . heap . borrow_ref_mut ( cs) . 0 . used ( ) )
6068 }
6169
6270 /// Returns an estimate of the amount of bytes available.
6371 pub fn free ( & self ) -> usize {
64- critical_section:: with ( |cs| self . heap . borrow ( cs) . borrow_mut ( ) . free ( ) )
72+ critical_section:: with ( |cs| self . heap . borrow_ref_mut ( cs) . 0 . free ( ) )
6573 }
6674
6775 fn alloc ( & self , layout : Layout ) -> Option < NonNull < u8 > > {
6876 critical_section:: with ( |cs| {
6977 self . heap
70- . borrow ( cs)
71- . borrow_mut ( )
78+ . borrow_ref_mut ( cs)
79+ . 0
7280 . allocate_first_fit ( layout)
7381 . ok ( )
7482 } )
@@ -77,8 +85,8 @@ impl Heap {
7785 unsafe fn dealloc ( & self , ptr : * mut u8 , layout : Layout ) {
7886 critical_section:: with ( |cs| {
7987 self . heap
80- . borrow ( cs)
81- . borrow_mut ( )
88+ . borrow_ref_mut ( cs)
89+ . 0
8290 . deallocate ( NonNull :: new_unchecked ( ptr) , layout)
8391 } ) ;
8492 }
0 commit comments