1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Simplify the implementation of Scheduler#block

* This shows block() with a timeout is similar to #kernel_sleep and also
  does not need to change `@blocking`.
This commit is contained in:
Benoit Daloze 2020-09-21 16:04:20 +02:00
parent 0fa1c82bfc
commit 2b73e6ba71

View file

@ -102,8 +102,8 @@ class Scheduler
self.run
ensure
@closed = true
# We freeze to detect any inadvertant modifications after the scheduler is closed:
# We freeze to detect any unintended modifications after the scheduler is closed:
self.freeze
end
@ -144,19 +144,21 @@ class Scheduler
# Used when blocking on synchronization (Mutex#lock, Queue#pop, SizedQueue#push, ...)
def block(blocker, timeout = nil)
# p [__method__, blocker, timeout]
@blocking += 1
if timeout
@waiting[Fiber.current] = current_time + timeout
end
Fiber.yield
ensure
@blocking -= 1
# Remove from @waiting in the case #unblock was called before the timeout expired:
if timeout
@waiting.delete(Fiber.current)
begin
Fiber.yield
ensure
# Remove from @waiting in the case #unblock was called before the timeout expired:
@waiting.delete(Fiber.current)
end
else
@blocking += 1
begin
Fiber.yield
ensure
@blocking -= 1
end
end
end