fn drop(&mut self) {
match self {
StreamInstance::TcpStream(_, ref mut tcp_stream) => {
- tcp_stream.shutdown(Shutdown::Both).unwrap();
+ tcp_stream.shutdown(Shutdown::Both).unwrap_or(())
}
StreamInstance::TlsStream(_, ref mut tls_stream) => {
- tls_stream.shutdown().unwrap();
+ tls_stream.shutdown().unwrap_or(());
}
_ => {}
}
}
}
+ 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() {
- stream.close();
+ if stream.is_closed() {
+ let stub = MachineError::functor_stub(
+ clause_name!("close"),
+ 1,
+ );
+
+ let addr = self.heap.to_unifiable(
+ HeapCellValue::Stream(stream.clone()),
+ );
- if let Some(ref alias) = stream.options().alias {
- indices.stream_aliases.remove(alias);
+ return Err(self.error_form(
+ MachineError::existence_error(
+ self.heap.h(),
+ ExistenceError::Stream(addr),
+ ),
+ stub,
+ ));
+ } else {
+ stream.close();
+
+ if let Some(ref alias) = stream.options().alias {
+ indices.stream_aliases.remove(alias);
+ }
}
}
}