This commit is contained in:
Yifan Wu 2020-12-14 16:18:33 +08:00
parent e93a4a0b76
commit 2d34cab989
14 changed files with 218 additions and 18 deletions

View file

@ -11,10 +11,11 @@ pub trait File : Any + Send + Sync {
}
impl dyn File {
#[allow(unused)]
pub fn downcast_ref<T: File>(&self) -> Option<&T> {
self.as_any_ref().downcast_ref::<T>()
}
}
pub use pipe::{Pipe};
pub use pipe::{Pipe, make_pipe};
pub use stdio::{Stdin, Stdout};

View file

@ -44,7 +44,7 @@ pub struct PipeRingBuffer {
head: usize,
tail: usize,
status: RingBufferStatus,
write_end: Option<Weak<Mutex<Pipe>>>,
write_end: Option<Weak<Pipe>>,
}
impl PipeRingBuffer {
@ -57,7 +57,7 @@ impl PipeRingBuffer {
write_end: None,
}
}
pub fn set_write_end(&mut self, write_end: &Arc<Mutex<Pipe>>) {
pub fn set_write_end(&mut self, write_end: &Arc<Pipe>) {
self.write_end = Some(Arc::downgrade(write_end));
}
pub fn write_byte(&mut self, byte: u8) {
@ -101,14 +101,14 @@ impl PipeRingBuffer {
}
/// Return (read_end, write_end)
pub fn make_pipe() -> (Arc<Mutex<Pipe>>, Arc<Mutex<Pipe>>) {
pub fn make_pipe() -> (Arc<Pipe>, Arc<Pipe>) {
let buffer = Arc::new(Mutex::new(PipeRingBuffer::new()));
let read_end = Arc::new(Mutex::new(
let read_end = Arc::new(
Pipe::read_end_with_buffer(buffer.clone())
));
let write_end = Arc::new(Mutex::new(
);
let write_end = Arc::new(
Pipe::write_end_with_buffer(buffer.clone())
));
);
buffer.lock().set_write_end(&write_end);
(read_end, write_end)
}

View file

@ -1,5 +1,5 @@
use super::File;
use crate::mm::{UserBuffer, UserBufferIterator};
use crate::mm::{UserBuffer};
use crate::sbi::console_getchar;
use crate::task::suspend_current_and_run_next;
use core::any::Any;