Project

General

Profile

Actions

Bug #15644

closed

ThreadsWait problems with Thread#report_on_exception

Bug #15644: ThreadsWait problems with Thread#report_on_exception

Added by kke (Kimmo Lehto) over 6 years ago. Updated over 3 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]
[ruby-core:91703]
Tags:

Description

Using ThreadsWait with Thread.report_on_exception is confusing.

ThreadsWait spawns a new thread for waiting on a thread:

 # thwait.rb:87 def join_nowait(*threads) threads.flatten! @threads.concat threads for th in threads Thread.start(th) do |t| begin t.join ensure @wait_queue.push t end end end end 

The t.join in ThreadsWait will re-raise the exceptions that happen in the thread being waited on.

If the thread being waited on was using report_on_exception = false, the wait thread will report the exception and the report_on_exception = false effectively did nothing, as you still got an exception report.

If the thread was using report_on_exception = true, both threads will report the exception, so you get it twice.

I think this could be fixed by always setting report_on_exception = false for the wait thread.

Example 1

require 'thwait' thread = Thread.new do Thread.current.report_on_exception = false sleep 1 raise "Foo" end ThreadsWait.all_waits(thread) do |terminated_thread| puts "Thread #{terminated_thread} terminated" end 

Expected result

No exception reports

Actual result

The wait thread will report the exception:

#<Thread:0x00007fa57d092d68@/Users/user/.rbenv/versions/2.6.1/lib/ruby/2.6.0/thwait.rb:91 run> terminated with exception (report_on_exception is true): 

Example 2

require 'thwait' thread = Thread.new do sleep 1 raise "Foo" end ThreadsWait.all_waits(thread) do |terminated_thread| puts "Thread #{terminated_thread} terminated" end 

Expected result

One exception report

Actual result

Two exception reports:

#<Thread:0x00007f9f83053320@test.rb:3 run> terminated with exception (report_on_exception is true): #<Thread:0x00007f9f830530a0@/Users/user/.rbenv/versions/2.6.1/lib/ruby/2.6.0/thwait.rb:91 run> terminated with exception (report_on_exception is true): Traceback (most recent call last): 

Updated by kke (Kimmo Lehto) over 6 years ago Actions #1

  • Description updated (diff)

Updated by kke (Kimmo Lehto) over 6 years ago Actions #2

  • Description updated (diff)

Updated by kke (Kimmo Lehto) over 6 years ago Actions #3

  • Description updated (diff)

Updated by jeremyevans0 (Jeremy Evans) about 6 years ago Actions #4 [ruby-core:95400]

  • Status changed from Open to Assigned
  • Assignee set to keiju (Keiju Ishitsuka)

I agree this is a bug that should be fixed. I have submitted a pull request to fix it: https://github.com/ruby/thwait/pull/1

Updated by jeremyevans0 (Jeremy Evans) over 3 years ago Actions #5

  • Status changed from Assigned to Closed
Actions

Also available in: PDF Atom