diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-11-08 19:55:27 +1300 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-11-08 20:40:52 +1300 |
commit | bed4848661d4a0397b36f481c0c0940277cc31f8 (patch) | |
tree | fb8a46dc75a81bac7ad7c5e8c0b95dd47854d5de | |
parent | 57b83dad4cd3c7d4b2a29829a1cb194c9b5ee9d1 (diff) | |
download | ruby-bed4848661d4a0397b36f481c0c0940277cc31f8.tar.gz |
Urgent notification pipe has same lifetime as scheduler.
-rw-r--r-- | test/fiber/scheduler.rb | 21 |
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) |