diff options
author | Benoit Daloze <eregontp@gmail.com> | 2020-09-17 14:45:44 +0200 |
---|---|---|
committer | Benoit Daloze <eregontp@gmail.com> | 2020-09-17 14:59:38 +0200 |
commit | 9472d160619861201bad91560c06248fef8362dc (patch) | |
tree | a2cf2586ca2c920c6f64f58971128982c8669dda /test/fiber | |
parent | 738a089b3ac55e5bfb26f9121ee73ffcb8c4a36b (diff) |
Call scheduler.block instead of scheduler.kernel_sleep for blocking Queue/SizedQueue operations
* scheduler.unblock was already already called before but with no corresponding scheduler.block
* add test that Queue#pop makes the scheduler wait until it gets an element.
Diffstat (limited to 'test/fiber')
-rw-r--r-- | test/fiber/scheduler.rb | 3 | ||||
-rw-r--r-- | test/fiber/test_mutex.rb | 25 |
2 files changed, 27 insertions, 1 deletions
diff --git a/test/fiber/scheduler.rb b/test/fiber/scheduler.rb index 1e7f60cdf0..f7a773ade1 100644 --- a/test/fiber/scheduler.rb +++ b/test/fiber/scheduler.rb @@ -93,6 +93,7 @@ class Scheduler end ensure @urgent.each(&:close) + @urgent = nil end def current_time @@ -139,7 +140,7 @@ class Scheduler end if io = @urgent&.last - @urgent.last.write_nonblock('.') + io.write_nonblock('.') end end diff --git a/test/fiber/test_mutex.rb b/test/fiber/test_mutex.rb index 1f53ae1a1f..baec559a70 100644 --- a/test/fiber/test_mutex.rb +++ b/test/fiber/test_mutex.rb @@ -115,6 +115,31 @@ class TestFiberMutex < Test::Unit::TestCase assert processed == 3 end + def test_queue_pop_waits + queue = Queue.new + running = false + + thread = Thread.new do + scheduler = Scheduler.new + Thread.current.scheduler = scheduler + + result = nil + Fiber.schedule do + result = queue.pop + end + + running = true + scheduler.run + result + end + + Thread.pass until running + sleep 0.1 + + queue << :done + assert_equal :done, thread.value + end + def test_mutex_deadlock err = /No live threads left. Deadlock\?/ assert_in_out_err %W[-I#{__dir__} -], <<-RUBY, ['in synchronize'], err, success: false |