diff --git a/filedescriptor/Cargo.toml b/filedescriptor/Cargo.toml index f0cff81ff..243ca18ed 100644 --- a/filedescriptor/Cargo.toml +++ b/filedescriptor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "filedescriptor" -version = "0.7.2" +version = "0.7.3" authors = ["Wez Furlong"] edition = "2018" repository = "https://github.com/wez/wezterm" diff --git a/filedescriptor/src/unix.rs b/filedescriptor/src/unix.rs index a85843c9a..3df146f5e 100644 --- a/filedescriptor/src/unix.rs +++ b/filedescriptor/src/unix.rs @@ -440,7 +440,7 @@ mod macos { let mut timeout = duration.map(|d| timeval { tv_sec: d.as_secs() as _, - tv_usec: d.as_micros() as _, + tv_usec: d.subsec_micros() as _, }); let res = unsafe { diff --git a/src/server/client.rs b/src/server/client.rs index 58a8d166b..ac79ed2c5 100644 --- a/src/server/client.rs +++ b/src/server/client.rs @@ -11,7 +11,7 @@ use crate::server::UnixStream; use crate::ssh::ssh_connect_with_ui; use anyhow::{anyhow, bail, Context, Error}; use crossbeam::channel::TryRecvError; -use filedescriptor::{pollfd, AsRawSocketDescriptor}; +use filedescriptor::{poll, pollfd, AsRawSocketDescriptor}; use log::info; use openssl::ssl::{SslConnector, SslFiletype, SslMethod}; use openssl::x509::X509; @@ -174,7 +174,17 @@ fn client_thread( let mut poll_array = [rx.as_poll_fd(), reconnectable.stream().as_poll_fd()]; if !reconnectable.stream().has_read_buffered() { - poll_for_read(&mut poll_array); + if let Err(err) = poll( + &mut poll_array, + Some(std::time::Duration::from_millis(1000)), + ) { + let reason = format!("Error while polling: {} {:?}", err, poll_array); + log::error!("{}", reason); + for (_, mut promise) in promises.into_iter() { + promise.result(Err(anyhow!("{}", reason))); + } + return Err(err).context("Error while polling"); + } } if poll_array[1].revents != 0 || reconnectable.stream().has_read_buffered() { diff --git a/src/server/listener/clientsession.rs b/src/server/listener/clientsession.rs index 84a53e26c..3f5ff2c21 100644 --- a/src/server/listener/clientsession.rs +++ b/src/server/listener/clientsession.rs @@ -4,6 +4,7 @@ use crate::server::listener::sessionhandler::SessionHandler; use crate::server::pollable::*; use anyhow::{bail, Context, Error}; use crossbeam::channel::TryRecvError; +use filedescriptor::poll; use log::error; use std::collections::HashSet; @@ -71,7 +72,10 @@ impl ClientSession { self.stream.as_poll_fd(), self.mux_rx.as_poll_fd(), ]; - poll_for_read(&mut poll_array); + poll( + &mut poll_array, + Some(std::time::Duration::from_millis(1000)), + )?; if poll_array[1].revents != 0 || self.stream.has_read_buffered() { loop { diff --git a/src/server/pollable.rs b/src/server/pollable.rs index 3ad04620c..584bb8794 100644 --- a/src/server/pollable.rs +++ b/src/server/pollable.rs @@ -129,9 +129,3 @@ impl AsPollFd for UnixStream { self.as_socket_descriptor().as_poll_fd() } } - -pub fn poll_for_read(pfd: &mut [pollfd]) { - if let Err(e) = poll(pfd, Some(std::time::Duration::from_millis(1000))) { - log::error!("poll failed for {}", e); - } -}