Skip to content

Commit

Permalink
Prefer to use Fiber#transfer in scheduler implementation. (#10479)
Browse files Browse the repository at this point in the history
  • Loading branch information
ioquatix committed Apr 7, 2024
1 parent ed4d03e commit bdb1fc1
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 9 deletions.
22 changes: 14 additions & 8 deletions test/fiber/scheduler.rb
Expand Up @@ -27,7 +27,9 @@ class Scheduler
Warning[:experimental] = experimental
end

def initialize
def initialize(fiber = Fiber.current)
@fiber = fiber

@readable = {}
@writable = {}
@waiting = {}
Expand All @@ -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}

Expand Down Expand Up @@ -88,7 +94,7 @@ def run
end

selected.each do |fiber, events|
fiber.resume(events)
fiber.transfer(events)
end

if @waiting.any?
Expand All @@ -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
Expand All @@ -114,7 +120,7 @@ def run
end

ready.each do |fiber|
fiber.resume
fiber.transfer
end
end
end
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -254,15 +260,15 @@ 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)
end
else
@blocking[fiber] = true
begin
Fiber.yield
@fiber.transfer
ensure
@blocking.delete(fiber)
end
Expand Down Expand Up @@ -290,7 +296,7 @@ def unblock(blocker, fiber)
def fiber(&block)
fiber = Fiber.new(blocking: false, &block)

fiber.resume
fiber.transfer

return fiber
end
Expand Down
2 changes: 1 addition & 1 deletion test/fiber/test_mutex.rb
Expand Up @@ -207,7 +207,7 @@ def test_mutex_deadlock
Fiber.schedule do
mutex.synchronize do
puts 'in synchronize'
Fiber.yield
scheduler.transfer
end
end
Expand Down

0 comments on commit bdb1fc1

Please sign in to comment.