Skip to content

Commit 237f113

Browse files
authored
Fix deadlock on Ctrl+C in server mode (ruby#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
1 parent 3c6f5f6 commit 237f113

File tree

2 files changed

+3
-12
lines changed

2 files changed

+3
-12
lines changed

lib/rdoc/rdoc.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -546,10 +546,6 @@ def generate
546546

547547
def start_server
548548
server = RDoc::Server.new(self, @options.server_port)
549-
550-
trap('INT') { server.shutdown }
551-
trap('TERM') { server.shutdown }
552-
553549
server.start
554550
end
555551

lib/rdoc/server.rb

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,10 @@ def start
9191
loop do
9292
client = @tcp_server.accept
9393
Thread.new(client) { |c| handle_client(c) }
94-
rescue IOError
95-
break
9694
end
97-
end
98-
99-
##
100-
# Shuts down the server.
101-
102-
def shutdown
95+
rescue Interrupt
96+
# Ctrl+C
97+
ensure
10398
@running = false
10499
@tcp_server&.close
105100
@watcher_thread&.join(2)

0 commit comments

Comments
 (0)