summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Daloze <eregontp@gmail.com>2020-09-21 14:04:20 (GMT)
committerBenoit Daloze <eregontp@gmail.com>2020-09-21 14:04:20 (GMT)
commit2b73e6ba712d35e6ec767bf722edf542cc2e47c6 (patch)
tree0a05d22b83daf80742dd064d39e292838dfb0a75
parent0fa1c82bfc3c679c49df2e586183db1efbd8f62c (diff)
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`.
-rw-r--r--test/fiber/scheduler.rb28
1 files changed, 15 insertions, 13 deletions
diff --git a/test/fiber/scheduler.rb b/test/fiber/scheduler.rb
index d93d0f1..c685e6f 100644
--- a/test/fiber/scheduler.rb
+++ b/test/fiber/scheduler.rb
@@ -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