From 237f113d96dc33296683aa91200be96263abc7a1 Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Mon, 16 Mar 2026 11:16:10 +0000 Subject: [PATCH] Fix deadlock on Ctrl+C in server mode (#1649) ## Summary - Pressing Ctrl+C in `rdoc --server` raised `ThreadError: deadlock; recursive locking` because the `INT` trap called `shutdown`, which closed the TCP server socket from the same thread blocked on `accept` - Replace trap-based shutdown with `rescue Interrupt` around the accept loop, and move cleanup into an `ensure` block --- lib/rdoc/rdoc.rb | 4 ---- lib/rdoc/server.rb | 11 +++-------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb index 65fab1a833..195bd21421 100644 --- a/lib/rdoc/rdoc.rb +++ b/lib/rdoc/rdoc.rb @@ -546,10 +546,6 @@ def generate def start_server server = RDoc::Server.new(self, @options.server_port) - - trap('INT') { server.shutdown } - trap('TERM') { server.shutdown } - server.start end diff --git a/lib/rdoc/server.rb b/lib/rdoc/server.rb index 724d492c63..3d08d18248 100644 --- a/lib/rdoc/server.rb +++ b/lib/rdoc/server.rb @@ -91,15 +91,10 @@ def start loop do client = @tcp_server.accept Thread.new(client) { |c| handle_client(c) } - rescue IOError - break end - end - - ## - # Shuts down the server. - - def shutdown + rescue Interrupt + # Ctrl+C + ensure @running = false @tcp_server&.close @watcher_thread&.join(2)