@@ -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. 
1818pub  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`. 
4855pub  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. 
5866pub  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. 
6371pub  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