diff --git a/src/memory/recycle.rs b/src/memory/recycle.rs index 34af97e208ef5008cbab50d22aa08ea5dffbb8a4..f006ec59e1ae32d81e516fdfb548166f3213d873 100644 --- a/src/memory/recycle.rs +++ b/src/memory/recycle.rs @@ -75,39 +75,36 @@ impl<T: FrameAllocator> FrameAllocator for RecycleAllocator<T> { } fn allocate_frames(&mut self, count: usize) -> Option<Frame> { - if count == 1 { - if ! self.free.is_empty() { - let mut i = 0; - { - let mut small = self.free[i]; - for j in 1..self.free.len() { - let free = self.free[j]; - // Later entries can be removed faster - if free.1 <= small.1 { - i = j; - small = free; - } + let mut small_i = None; + { + let mut small = (0, 0); + for i in 0..self.free.len() { + let free = self.free[i]; + // Later entries can be removed faster + if free.1 >= count { + if free.1 <= small.1 || small_i.is_none() { + small_i = Some(i); + small = free; } } + } + } - let (address, remove) = { - let free = &mut self.free[i]; - free.1 -= 1; - (free.0 + free.1 * 4096, free.1 == 0) - }; + if let Some(i) = small_i { + let (address, remove) = { + let free = &mut self.free[i]; + free.1 -= 1; + (free.0 + free.1 * 4096, free.1 == 0) + }; - if remove { - 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) + if remove { + self.free.remove(i); } + + //println!("Restoring frame {:?}, {}", frame, count); + Some(Frame::containing_address(PhysicalAddress::new(address))) } else { - println!("Could not restore frame {}", count); + //println!("No saved frames {}", count); self.inner.allocate_frames(count) } } @@ -119,7 +116,7 @@ impl<T: FrameAllocator> FrameAllocator for RecycleAllocator<T> { self.free.push((address, count)); } } else { - println!("Could not save frame {:?}, {}", frame, count); + //println!("Could not save frame {:?}, {}", frame, count); self.inner.deallocate_frames(frame, count); } }