diff --git a/test/fiber/scheduler.rb b/test/fiber/scheduler.rb index 5090271db157db..3926226ca334d9 100644 --- a/test/fiber/scheduler.rb +++ b/test/fiber/scheduler.rb @@ -27,7 +27,9 @@ class Scheduler Warning[:experimental] = experimental end - def initialize + def initialize(fiber = Fiber.current) + @fiber = fiber + @readable = {} @writable = {} @waiting = {} @@ -45,6 +47,10 @@ def initialize attr :writable attr :waiting + def transfer + @fiber.transfer + end + def next_timeout _fiber, timeout = @waiting.min_by{|key, value| value} @@ -88,7 +94,7 @@ def run end selected.each do |fiber, events| - fiber.resume(events) + fiber.transfer(events) end if @waiting.any? @@ -98,7 +104,7 @@ def run waiting.each do |fiber, timeout| if fiber.alive? if timeout <= time - fiber.resume + fiber.transfer else @waiting[fiber] = timeout end @@ -114,7 +120,7 @@ def run end ready.each do |fiber| - fiber.resume + fiber.transfer end end end @@ -217,7 +223,7 @@ def io_wait(io, events, duration) @waiting[fiber] = current_time + duration end - Fiber.yield + @fiber.transfer ensure @waiting.delete(fiber) if duration @readable.delete(io) if readable @@ -254,7 +260,7 @@ def block(blocker, timeout = nil) if timeout @waiting[fiber] = current_time + timeout begin - Fiber.yield + @fiber.transfer ensure # Remove from @waiting in the case #unblock was called before the timeout expired: @waiting.delete(fiber) @@ -262,7 +268,7 @@ def block(blocker, timeout = nil) else @blocking[fiber] = true begin - Fiber.yield + @fiber.transfer ensure @blocking.delete(fiber) end @@ -290,7 +296,7 @@ def unblock(blocker, fiber) def fiber(&block) fiber = Fiber.new(blocking: false, &block) - fiber.resume + fiber.transfer return fiber end diff --git a/test/fiber/test_mutex.rb b/test/fiber/test_mutex.rb index 449c49f38bc81e..2cee2cc235684b 100644 --- a/test/fiber/test_mutex.rb +++ b/test/fiber/test_mutex.rb @@ -207,7 +207,7 @@ def test_mutex_deadlock Fiber.schedule do mutex.synchronize do puts 'in synchronize' - Fiber.yield + scheduler.transfer end end