devices/virtio/console/
input.rs1use std::collections::VecDeque;
8use std::io::Write;
9
10use crate::virtio::Queue;
11
12pub fn process_receive_queue(buffer: &mut VecDeque<u8>, receive_queue: &mut Queue) {
20 while let Some(mut desc) = receive_queue.peek() {
21 if buffer.is_empty() {
22 break;
23 }
24
25 let writer = &mut desc.writer;
26 while writer.available_bytes() > 0 && !buffer.is_empty() {
27 let (buffer_front, buffer_back) = buffer.as_slices();
28 let buffer_chunk = if !buffer_front.is_empty() {
29 buffer_front
30 } else {
31 buffer_back
32 };
33 let written = writer.write(buffer_chunk).unwrap();
34 drop(buffer.drain(..written));
35 }
36
37 if writer.bytes_written() > 0 {
38 let desc = desc.pop();
39 receive_queue.add_used(desc);
40 receive_queue.trigger_interrupt();
41 }
42 }
43}