Skip to content
Snippets Groups Projects
Commit 7b5873e4 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Allow allocation of larger sizes

parent b3a3caf1
No related branches found
No related tags found
No related merge requests found
...@@ -75,39 +75,36 @@ impl<T: FrameAllocator> FrameAllocator for RecycleAllocator<T> { ...@@ -75,39 +75,36 @@ impl<T: FrameAllocator> FrameAllocator for RecycleAllocator<T> {
} }
fn allocate_frames(&mut self, count: usize) -> Option<Frame> { fn allocate_frames(&mut self, count: usize) -> Option<Frame> {
if count == 1 { let mut small_i = None;
if ! self.free.is_empty() { {
let mut i = 0; let mut small = (0, 0);
{ for i in 0..self.free.len() {
let mut small = self.free[i]; let free = self.free[i];
for j in 1..self.free.len() { // Later entries can be removed faster
let free = self.free[j]; if free.1 >= count {
// Later entries can be removed faster if free.1 <= small.1 || small_i.is_none() {
if free.1 <= small.1 { small_i = Some(i);
i = j; small = free;
small = free;
}
} }
} }
}
}
let (address, remove) = { if let Some(i) = small_i {
let free = &mut self.free[i]; let (address, remove) = {
free.1 -= 1; let free = &mut self.free[i];
(free.0 + free.1 * 4096, free.1 == 0) free.1 -= 1;
}; (free.0 + free.1 * 4096, free.1 == 0)
};
if remove { if remove {
self.free.remove(i); self.free.remove(i);
}
//println!("Restoring frame {:?}, {}", frame, count);
Some(Frame::containing_address(PhysicalAddress::new(address)))
} else {
//println!("No saved frames {}", count);
self.inner.allocate_frames(count)
} }
//println!("Restoring frame {:?}, {}", frame, count);
Some(Frame::containing_address(PhysicalAddress::new(address)))
} else { } else {
println!("Could not restore frame {}", count); //println!("No saved frames {}", count);
self.inner.allocate_frames(count) self.inner.allocate_frames(count)
} }
} }
...@@ -119,7 +116,7 @@ impl<T: FrameAllocator> FrameAllocator for RecycleAllocator<T> { ...@@ -119,7 +116,7 @@ impl<T: FrameAllocator> FrameAllocator for RecycleAllocator<T> {
self.free.push((address, count)); self.free.push((address, count));
} }
} else { } else {
println!("Could not save frame {:?}, {}", frame, count); //println!("Could not save frame {:?}, {}", frame, count);
self.inner.deallocate_frames(frame, count); self.inner.deallocate_frames(frame, count);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment