Skip to content

Commit

Permalink
[ruby/timeout] Don't move the timer_thread when it's enclosed
Browse files Browse the repository at this point in the history
Don't move the timer_thread to ThreadGroup::Default, when it's
created in an enclosed ThreadGroup.
Prevents the exception: "add" can't move from the enclosed thread group"

ruby/timeout@eb889d2c8b
  • Loading branch information
gamecreature authored and matzbot committed Feb 15, 2023
1 parent 8943b0d commit 610375e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/timeout.rb
Expand Up @@ -120,7 +120,7 @@ def self.create_timeout_thread
requests.reject!(&:done?)
end
end
ThreadGroup::Default.add(watcher)
ThreadGroup::Default.add(watcher) unless watcher.group.enclosed?
watcher.name = "Timeout stdlib thread"
watcher.thread_variable_set(:"\0__detached_thread__", true)
watcher
Expand Down
19 changes: 19 additions & 0 deletions test/test_timeout.rb
Expand Up @@ -172,4 +172,23 @@ def test_threadgroup
end;
end

def test_handling_enclosed_threadgroup
# The problem "add: can't move from the enclosed thread group" #24,
# happens when the timeout_thread is created in an enclosed ThreadGroup.
assert_separately(%w[-rtimeout], <<-'end;')
t1 = Thread.new {
Thread.stop
assert_block do
Timeout.timeout(0.1) {}
true
end
}
sleep 0.1 while t1.status != 'sleep'
group = ThreadGroup.new
group.add(t1)
group.enclose
t1.run
t1.join
end;
end
end

0 comments on commit 610375e

Please sign in to comment.