From: "kosaki (Motohiro KOSAKI)" Date: 2013-08-31T02:20:36+09:00 Subject: [ruby-core:56889] [ruby-trunk - Bug #7648][Rejected] GServer does not close cleanly from signal interrupt context Issue #7648 has been updated by kosaki (Motohiro KOSAKI). Status changed from Assigned to Rejected Holding mutex in trap is deadlockable. It is what ruby complained. The best workaround is to make new thread in trap handler and stop gserver asynchnorously, I think. ---------------------------------------- Bug #7648: GServer does not close cleanly from signal interrupt context https://bugs.ruby-lang.org/issues/7648#change-41437 Author: jleo3 (Joe Leo) Status: Rejected Priority: Normal Assignee: kosaki (Motohiro KOSAKI) Category: lib Target version: next minor ruby -v: ruby 2.0.0dev (2013-01-02 trunk 38676) [i686-linux] Backport: SUMMARY: When a signal interrupt is trapped, we can no longer call #close on GServer without it throwing a ThreadError. STEPS TO REPEAT: 1) Run the following code: require 'gserver' server = GServer.new 8080 server.start trap("SIGINT") { server.stop } gets # or any command that keeps the process running 2) Hit CTRL+C or whichever command will send the interrupt signal to this program. WHAT I EXPECTED: In version 1.9.3, CTRL+C sends an interrupt signal and the program exits cleanly. WHAT HAPPENED: When running the version from trunk the following stack trace is thrown. ^C/home/joe/.rvm/rubies/ruby-head/lib/ruby/2.0.0/gserver.rb:116:in `synchronize': can't be called from trap context (ThreadError) from /home/joe/.rvm/rubies/ruby-head/lib/ruby/2.0.0/gserver.rb:116:in `stop' from gserver_bug.rb:5:in `block in
' from gserver_bug.rb:6:in `call' from gserver_bug.rb:6:in `gets' from gserver_bug.rb:6:in `gets' from gserver_bug.rb:6:in `
' POSSIBLY RELEVANT: https://bugs.ruby-lang.org/issues/6416 NOTE: This was tried with AND without RVM with the same results. -- http://bugs.ruby-lang.org/