Allow O_NONBLOCK to be passed to pipe
This commit is contained in:
parent
ad448956d6
commit
6d19f59c08
|
@ -5,6 +5,7 @@ use spin::{Mutex, Once, RwLock, RwLockReadGuard, RwLockWriteGuard};
|
||||||
|
|
||||||
use sync::WaitCondition;
|
use sync::WaitCondition;
|
||||||
use syscall::error::{Error, Result, EBADF, EPIPE};
|
use syscall::error::{Error, Result, EBADF, EPIPE};
|
||||||
|
use syscall::flag::O_NONBLOCK;
|
||||||
use syscall::scheme::Scheme;
|
use syscall::scheme::Scheme;
|
||||||
|
|
||||||
/// Pipes list
|
/// Pipes list
|
||||||
|
@ -27,11 +28,11 @@ fn pipes_mut() -> RwLockWriteGuard<'static, (BTreeMap<usize, PipeRead>, BTreeMap
|
||||||
PIPES.call_once(init_pipes).write()
|
PIPES.call_once(init_pipes).write()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn pipe(_flags: usize) -> (usize, usize) {
|
pub fn pipe(flags: usize) -> (usize, usize) {
|
||||||
let mut pipes = pipes_mut();
|
let mut pipes = pipes_mut();
|
||||||
let read_id = PIPE_NEXT_ID.fetch_add(1, Ordering::SeqCst);
|
let read_id = PIPE_NEXT_ID.fetch_add(1, Ordering::SeqCst);
|
||||||
let write_id = PIPE_NEXT_ID.fetch_add(1, Ordering::SeqCst);
|
let write_id = PIPE_NEXT_ID.fetch_add(1, Ordering::SeqCst);
|
||||||
let read = PipeRead::new();
|
let read = PipeRead::new(flags);
|
||||||
let write = PipeWrite::new(&read);
|
let write = PipeWrite::new(&read);
|
||||||
pipes.0.insert(read_id, read);
|
pipes.0.insert(read_id, read);
|
||||||
pipes.1.insert(write_id, write);
|
pipes.1.insert(write_id, write);
|
||||||
|
@ -104,13 +105,15 @@ impl Scheme for PipeScheme {
|
||||||
/// Read side of a pipe
|
/// Read side of a pipe
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct PipeRead {
|
pub struct PipeRead {
|
||||||
|
flags: usize,
|
||||||
condition: Arc<WaitCondition>,
|
condition: Arc<WaitCondition>,
|
||||||
vec: Arc<Mutex<VecDeque<u8>>>
|
vec: Arc<Mutex<VecDeque<u8>>>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PipeRead {
|
impl PipeRead {
|
||||||
pub fn new() -> Self {
|
pub fn new(flags: usize) -> Self {
|
||||||
PipeRead {
|
PipeRead {
|
||||||
|
flags: flags,
|
||||||
condition: Arc::new(WaitCondition::new()),
|
condition: Arc::new(WaitCondition::new()),
|
||||||
vec: Arc::new(Mutex::new(VecDeque::new())),
|
vec: Arc::new(Mutex::new(VecDeque::new())),
|
||||||
}
|
}
|
||||||
|
@ -136,7 +139,7 @@ impl PipeRead {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if Arc::weak_count(&self.vec) == 0 {
|
if self.flags & O_NONBLOCK == O_NONBLOCK || Arc::weak_count(&self.vec) == 0 {
|
||||||
return Ok(0);
|
return Ok(0);
|
||||||
} else {
|
} else {
|
||||||
self.condition.wait();
|
self.condition.wait();
|
||||||
|
|
Loading…
Reference in a new issue