use std::collections::VecDeque;
use std::io::Write;
use crate::virtio::Queue;
pub fn process_receive_queue(buffer: &mut VecDeque<u8>, receive_queue: &mut Queue) {
while let Some(mut desc) = receive_queue.peek() {
if buffer.is_empty() {
break;
}
let writer = &mut desc.writer;
while writer.available_bytes() > 0 && !buffer.is_empty() {
let (buffer_front, buffer_back) = buffer.as_slices();
let buffer_chunk = if !buffer_front.is_empty() {
buffer_front
} else {
buffer_back
};
let written = writer.write(buffer_chunk).unwrap();
drop(buffer.drain(..written));
}
if writer.bytes_written() > 0 {
let desc = desc.pop();
receive_queue.add_used(desc);
receive_queue.trigger_interrupt();
}
}
}