aboutsummaryrefslogtreecommitdiffstats
path: root/test/fiber
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2020-11-08 19:55:27 +1300
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2020-11-08 20:40:52 +1300
commitbed4848661d4a0397b36f481c0c0940277cc31f8 (patch)
treefb8a46dc75a81bac7ad7c5e8c0b95dd47854d5de /test/fiber
parent57b83dad4cd3c7d4b2a29829a1cb194c9b5ee9d1 (diff)
downloadruby-bed4848661d4a0397b36f481c0c0940277cc31f8.tar.gz
Urgent notification pipe has same lifetime as scheduler.
Diffstat (limited to 'test/fiber')
-rw-r--r--test/fiber/scheduler.rb21
1 files changed, 10 insertions, 11 deletions
diff --git a/test/fiber/scheduler.rb b/test/fiber/scheduler.rb
index 8879048a2b..7cf0c26459 100644
--- a/test/fiber/scheduler.rb
+++ b/test/fiber/scheduler.rb
@@ -25,7 +25,7 @@ class Scheduler
@blocking = 0
@ready = []
- @urgent = nil
+ @urgent = IO.pipe
end
attr :readable
@@ -47,8 +47,6 @@ class Scheduler
end
def run
- @urgent = IO.pipe
-
while @readable.any? or @writable.any? or @waiting.any? or @blocking.positive?
# Can only handle file descriptors up to 1024...
readable, writable = IO.select(@readable.keys + [@urgent.first], @writable.keys, [], next_timeout)
@@ -95,9 +93,6 @@ class Scheduler
end
end
end
- ensure
- @urgent.each(&:close)
- @urgent = nil
end
def close
@@ -105,6 +100,9 @@ class Scheduler
self.run
ensure
+ @urgent.each(&:close)
+ @urgent = nil
+
@closed = true
# We freeze to detect any unintended modifications after the scheduler is closed:
@@ -142,7 +140,8 @@ class Scheduler
# Used when blocking on synchronization (Mutex#lock, Queue#pop, SizedQueue#push, ...)
def block(blocker, timeout = nil)
- # p [__method__, blocker, timeout]
+ # $stderr.puts [__method__, blocker, timeout].inspect
+
if timeout
@waiting[Fiber.current] = current_time + timeout
begin
@@ -164,14 +163,14 @@ class Scheduler
# Used when synchronization wakes up a previously-blocked fiber (Mutex#unlock, Queue#push, ...).
# This might be called from another thread.
def unblock(blocker, fiber)
- # p [__method__, blocker, fiber]
+ # $stderr.puts [__method__, blocker, fiber].inspect
+
@lock.synchronize do
@ready << fiber
end
- if io = @urgent&.last
- io.write_nonblock('.')
- end
+ io = @urgent.last
+ io.write_nonblock('.')
end
def fiber(&block)