}
}
-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 {
}
#[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]
}
}
- 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)
}
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,
),
stub,
));
- } else {
- stream.close();
-
- if let Some(ref alias) = stream.options().alias {
- indices.stream_aliases.remove(alias);
- }
}
}
}