MCPcopy Create free account
hub / github.com/dropbox/rust-alloc-no-stdlib / alloc_cell

Method alloc_cell

src/stack_allocator.rs:37–77  ·  view source on GitHub ↗
(self : &mut StackAllocator<'a, T, U>,
                  len : usize)

Source from the content-addressed store, hash-verified

35 Allocator<T> for StackAllocator <'a, T, U> {
36 type AllocatedMemory = AllocatedStackMemory<'a, T>;
37 fn alloc_cell(self : &mut StackAllocator<'a, T, U>,
38 len : usize) -> AllocatedStackMemory<'a, T> {
39 if len == 0 {
40 return AllocatedStackMemory::<'a, T>::default();
41 }
42 let mut index : usize = self.free_list_start;
43 let mut found : bool = false;
44 for free_resource in self.system_resources.slice()[self.free_list_start..].iter() {
45 if free_resource.len() >= len {
46 found = true;
47 break;
48 }
49 index += 1;
50 }
51 if !found {
52 panic!("OOM");
53 }
54 let available_slice = core::mem::replace(&mut self.system_resources.slice_mut()[index],
55 &mut[]);
56 if available_slice.len() == len
57 || (available_slice.len() < len + 32
58 && index + 1 != self.system_resources.slice().len()) {
59 // we don't want really small wasted slices
60 // we must assign free_list_start
61 if index != self.free_list_start {
62 assert!(index > self.free_list_start);
63 let farthest_free_list = core::mem::replace(
64 &mut self.system_resources.slice_mut()[self.free_list_start],
65 &mut []);
66 let _ = core::mem::replace(&mut self.system_resources.slice_mut()[index],
67 farthest_free_list);
68 }
69 self.free_list_start += 1;
70 return self.clear_if_necessary(index,
71 AllocatedStackMemory::<'a, T>{mem:available_slice});
72 } else { // the memory allocated was not the entire range of items. Split and move on
73 let (retval, return_to_sender) = available_slice.split_at_mut(len);
74 let _ = core::mem::replace(&mut self.system_resources.slice_mut()[index], return_to_sender);
75 return self.clear_if_necessary(index, AllocatedStackMemory::<'a, T>{mem:retval});
76 }
77 }
78 fn free_cell(self : &mut StackAllocator<'a, T, U>,
79 val : AllocatedStackMemory<'a, T>) {
80 if val.slice().len() == 0 {

Callers

nothing calls this directly

Calls 4

lenMethod · 0.80
clear_if_necessaryMethod · 0.80
sliceMethod · 0.45
slice_mutMethod · 0.45

Tested by

no test coverage detected