From 3bcf3bbe4fb6cb6431610c3faf38330f0bba4b40 Mon Sep 17 00:00:00 2001 From: Rick Blommers Date: Sun, 12 Feb 2023 15:23:37 +0100 Subject: [PATCH] Don't move the timer_thread when it's enclosed 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" --- lib/timeout.rb | 2 +- test/test_timeout.rb | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/timeout.rb b/lib/timeout.rb index 7f40baf..1d092f7 100644 --- a/lib/timeout.rb +++ b/lib/timeout.rb @@ -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 diff --git a/test/test_timeout.rb b/test/test_timeout.rb index 2d3dd16..89fb10a 100644 --- a/test/test_timeout.rb +++ b/test/test_timeout.rb @@ -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