use shutdown error values to throw exceptions in close stream

This commit is contained in:
Adrián Arroyo Calle
2021-09-30 00:10:03 +02:00
parent 4d0998ef72
commit 47d811c250
2 changed files with 17 additions and 36 deletions

View File

@@ -160,20 +160,6 @@ impl StreamInstance {
}
}
impl Drop for StreamInstance {
fn drop(&mut self) {
match self {
StreamInstance::TcpStream(_, ref mut tcp_stream) => {
tcp_stream.shutdown(Shutdown::Both).unwrap_or(())
}
StreamInstance::TlsStream(_, ref mut tls_stream) => {
tls_stream.shutdown().unwrap_or(());
}
_ => {}
}
}
}
impl fmt::Debug for StreamInstance {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match self {
@@ -596,8 +582,18 @@ impl Stream {
}
#[inline]
pub(crate) fn close(&mut self) {
pub(crate) fn close(&mut self) -> Result<(), std::io::Error> {
let result = match self.stream_inst.0.borrow_mut().stream_inst {
StreamInstance::TcpStream(_, ref mut tcp_stream) => {
tcp_stream.shutdown(Shutdown::Both)
},
StreamInstance::TlsStream(_, ref mut tls_stream) => {
tls_stream.shutdown()
}
_ => Ok(())
};
self.stream_inst.0.borrow_mut().stream_inst = StreamInstance::Null;
result
}
#[inline]
@@ -636,20 +632,6 @@ impl Stream {
}
}
pub(crate) fn is_closed(&self) -> bool {
match self.stream_inst.0.borrow_mut().stream_inst {
StreamInstance::Null => true,
StreamInstance::TcpStream(_, ref mut tcp_stream) => {
let mut buf = [0;8];
match tcp_stream.peek(&mut buf) {
Ok(n_bytes) => n_bytes == 0,
Err(_) => true
}
},
_ => false
}
}
fn unpause_stream(&mut self) {
let stream_inst = match self.stream_inst.0.borrow_mut().stream_inst {
StreamInstance::PausedPrologStream(ref put_back, ref mut stream_inst)

View File

@@ -2704,7 +2704,12 @@ impl MachineState {
}
if !stream.is_stdin() && !stream.is_stdout() && !stream.is_stderr() {
if stream.is_closed() {
let close_result = stream.close();
if let Some(ref alias) = stream.options().alias {
indices.stream_aliases.remove(alias);
}
if let Err(_) = close_result {
let stub = MachineError::functor_stub(
clause_name!("close"),
1,
@@ -2721,12 +2726,6 @@ impl MachineState {
),
stub,
));
} else {
stream.close();
if let Some(ref alias) = stream.options().alias {
indices.stream_aliases.remove(alias);
}
}
}
}