aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src')
-rw-r--r--alacritty/src/main.rs13
1 files changed, 13 insertions, 0 deletions
diff --git a/alacritty/src/main.rs b/alacritty/src/main.rs
index 871c816e..9b5b8eb8 100644
--- a/alacritty/src/main.rs
+++ b/alacritty/src/main.rs
@@ -222,6 +222,19 @@ fn run(window_event_loop: GlutinEventLoop<Event>, config: Config) -> Result<(),
// Start event loop and block until shutdown
processor.run(terminal, window_event_loop);
+ // This explicit drop is needed for Windows, ConPTY backend. Otherwise a deadlock can occur.
+ // The cause:
+ // - Drop for Conpty will deadlock if the conout pipe has already been dropped.
+ // - The conout pipe is dropped when the io_thread is joined below (io_thread owns pty).
+ // - Conpty is dropped when the last of processor and io_thread are dropped, because both of
+ // them own an Arc<Conpty>.
+ //
+ // The fix is to ensure that processor is dropped first. That way, when io_thread (i.e. pty)
+ // is dropped, it can ensure Conpty is dropped before the conout pipe in the pty drop order.
+ //
+ // FIXME: Change PTY API to enforce the correct drop order with the typesystem.
+ drop(processor);
+
// Shutdown PTY parser event loop
loop_tx.send(Msg::Shutdown).expect("Error sending shutdown to pty event loop");
io_thread.join().expect("join io thread");