mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-04-13 02:31:29 +03:00
fix: try to fix stuck on read (#12310)
Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
@@ -481,6 +481,7 @@ impl TerminalSession {
|
|||||||
if let Some(input_tx) = self.input_tx.take() {
|
if let Some(input_tx) = self.input_tx.take() {
|
||||||
// Send a final newline to ensure the reader can read some data, and then exit.
|
// Send a final newline to ensure the reader can read some data, and then exit.
|
||||||
// This is required on Windows and Linux.
|
// This is required on Windows and Linux.
|
||||||
|
// Although `self.pty_pair = None;` is called below, we can still send a final newline here.
|
||||||
if let Err(e) = input_tx.send(b"\r\n".to_vec()) {
|
if let Err(e) = input_tx.send(b"\r\n".to_vec()) {
|
||||||
log::warn!("Failed to send final newline to the terminal: {}", e);
|
log::warn!("Failed to send final newline to the terminal: {}", e);
|
||||||
}
|
}
|
||||||
@@ -488,6 +489,20 @@ impl TerminalSession {
|
|||||||
}
|
}
|
||||||
self.output_rx = None;
|
self.output_rx = None;
|
||||||
|
|
||||||
|
// 1. Windows
|
||||||
|
// `pty_pair` uses pipe. https://github.com/rustdesk-org/wezterm/blob/80174f8009f41565f0fa8c66dab90d4f9211ae16/pty/src/win/conpty.rs#L16
|
||||||
|
// `read()` may stuck at https://github.com/rustdesk-org/wezterm/blob/80174f8009f41565f0fa8c66dab90d4f9211ae16/filedescriptor/src/windows.rs#L345
|
||||||
|
// We can close the pipe to signal the reader thread to exit.
|
||||||
|
// After https://github.com/rustdesk-org/wezterm/blob/80174f8009f41565f0fa8c66dab90d4f9211ae16/pty/src/win/psuedocon.rs#L86, the reader reads `[27, 91, 63, 57, 48, 48, 49, 108, 27, 91, 63, 49, 48, 48, 52, 108]` in my tests.
|
||||||
|
// 2. Linux
|
||||||
|
// `pty_pair` uses `libc::openpty`. https://github.com/rustdesk-org/wezterm/blob/80174f8009f41565f0fa8c66dab90d4f9211ae16/pty/src/unix.rs#L32
|
||||||
|
// We can also call the drop method first. https://github.com/rustdesk-org/wezterm/blob/80174f8009f41565f0fa8c66dab90d4f9211ae16/pty/src/unix.rs#L352
|
||||||
|
// The reader will get [13, 10] after dropping the `pty_pair`.
|
||||||
|
// 3. macOS
|
||||||
|
// No stuck cases have been found so far, more testing is needed.
|
||||||
|
#[cfg(any(target_os = "windows", target_os = "linux"))]
|
||||||
|
self.pty_pair = None;
|
||||||
|
|
||||||
// Wait for threads to finish
|
// Wait for threads to finish
|
||||||
// The reader thread should join before the writer thread on Windows.
|
// The reader thread should join before the writer thread on Windows.
|
||||||
if let Some(reader_thread) = self.reader_thread.take() {
|
if let Some(reader_thread) = self.reader_thread.take() {
|
||||||
|
|||||||
Reference in New Issue
Block a user