From 501fff14c7657f769d68f90de98fd2ebccb807fb Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Sun, 20 Sep 2020 11:34:02 +1200 Subject: When setting current thread scheduler to nil, invoke `#close`. --- test/fiber/scheduler.rb | 15 +++++++++++++++ test/fiber/test_scheduler.rb | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) (limited to 'test') diff --git a/test/fiber/scheduler.rb b/test/fiber/scheduler.rb index 43edcb27ed..10854aac2c 100644 --- a/test/fiber/scheduler.rb +++ b/test/fiber/scheduler.rb @@ -19,6 +19,8 @@ class Scheduler @writable = {} @waiting = {} + @closed = false + @lock = Mutex.new @locking = 0 @ready = [] @@ -96,6 +98,19 @@ class Scheduler @urgent = nil end + def close + self.run + ensure + @closed = true + + # We freeze to detect any inadvertant modifications after the scheduler is closed: + self.freeze + end + + def closed? + @closed + end + def current_time Process.clock_gettime(Process::CLOCK_MONOTONIC) end diff --git a/test/fiber/test_scheduler.rb b/test/fiber/test_scheduler.rb index 7acf63d9b8..23fd8b4493 100644 --- a/test/fiber/test_scheduler.rb +++ b/test/fiber/test_scheduler.rb @@ -10,4 +10,29 @@ class TestFiberScheduler < Test::Unit::TestCase end end end + + def test_closed_at_thread_exit + scheduler = Scheduler.new + + thread = Thread.new do + Thread.current.scheduler = scheduler + end + + thread.join + + assert scheduler.closed? + end + + def test_closed_when_set_to_nil + scheduler = Scheduler.new + + thread = Thread.new do + Thread.current.scheduler = scheduler + Thread.current.scheduler = nil + + assert scheduler.closed? + end + + thread.join + end end -- cgit v1.2.3