From: "rklemme (Robert Klemme)" Date: 2012-04-14T00:10:46+09:00 Subject: [ruby-core:44341] [ruby-trunk - Bug #6288] Change error message for thread block to be less misleading Issue #6288 has been updated by rklemme (Robert Klemme). Hi, thanks for looking into this! mame (Yusuke Endoh) wrote: > Is "possible deadlock detected" better? If I understand properly what the deadlock check does (see also #5258) it merely verifies that there is at least one thread left which could wake up this thread. So I'd rather have something like "No live threads left. Deadlock?", but then again my understanding of the code in question is not too thorough. > Please elaborate "a more complex scenario" with small example. $ ruby19 -r thread -e 'q=SizedQueue.new(100);r=Thread.new {until (x=q.deq).nil?; raise "SilentError";end};1000.times {|i| q.enq i};q.enq nil' /opt/lib/ruby/1.9.1/thread.rb:301:in `sleep': deadlock detected (fatal) from /opt/lib/ruby/1.9.1/thread.rb:301:in `block in push' from :10:in `synchronize' from /opt/lib/ruby/1.9.1/thread.rb:297:in `push' from -e:1:in `block in
' from -e:1:in `times' from -e:1:in `
' Basically what happens is that the reader thread silently dies as you can see if you set Thread.abort_on_exception: $ ruby19 -r thread -e 'Thread.abort_on_exception=true;q=SizedQueue.new(100);r=Thread.new {until (x=q.deq).nil?; raise "SilentError";end};1000.times {|i| q.enq i};q.enq nil' -e:1:in `block in
': SilentError (RuntimeError) Kind regards robert ---------------------------------------- Bug #6288: Change error message for thread block to be less misleading https://bugs.ruby-lang.org/issues/6288#change-25885 Author: rklemme (Robert Klemme) Status: Feedback Priority: Normal Assignee: Category: core Target version: ruby -v: ruby 1.9.3p125 (2012-02-16) [i386-cygwin] Test case: 11:50:07 ~$ ruby19 -r thread -e 'q=SizedQueue.new 10;1_000_000.times {|i| p i;q.enq i}' 0 1 2 3 4 5 6 7 8 9 10 /opt/lib/ruby/1.9.1/thread.rb:301:in `sleep': deadlock detected (fatal) from /opt/lib/ruby/1.9.1/thread.rb:301:in `block in push' from :10:in `synchronize' from /opt/lib/ruby/1.9.1/thread.rb:297:in `push' from -e:1:in `block in
' from -e:1:in `times' from -e:1:in `
' This is not a deadlock, but there is no other thread which could wake up main thread. Deadlock is misleading because in a more complex scenario where I had the error initially it wasn't obvious that the other thread had died and I looked for the wrong error in my code. -- http://bugs.ruby-lang.org/