diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-09-06 14:48:52 +1200 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-09-14 16:44:09 +1200 |
commit | 1a0cfe28390ce5d46f7b854eaad2b9b979c160de (patch) | |
tree | 63f5fd6d8cf9de64365039638ecd49e894858926 /test/fiber/scheduler.rb | |
parent | 3dc0fc11f0e21087c96781cce2360f5f6a26c7c6 (diff) |
Improve handling of urgent notification pipe.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3434
Diffstat (limited to 'test/fiber/scheduler.rb')
-rw-r--r-- | test/fiber/scheduler.rb | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/test/fiber/scheduler.rb b/test/fiber/scheduler.rb index fa05daf886..b03058a210 100644 --- a/test/fiber/scheduler.rb +++ b/test/fiber/scheduler.rb @@ -15,11 +15,9 @@ class Scheduler @writable = {} @waiting = {} - @urgent = nil - @lock = Mutex.new @locking = 0 - @ready = [] + @ready = Array.new end attr :readable @@ -51,11 +49,17 @@ class Scheduler # puts "writable: #{writable}" if writable&.any? readable&.each do |io| - @readable[io]&.resume + if fiber = @readable.delete(io) + fiber.resume + elsif io == @urgent.first + @urgent.first.read_nonblock(1024) + end end writable&.each do |io| - @writable[io]&.resume + if fiber = @writable.delete(io) + fiber.resume + end end if @waiting.any? @@ -73,9 +77,6 @@ class Scheduler end if @ready.any? - # Clear out the urgent notification pipe. - @urgent.first.read_nonblock(1024) - ready = nil @lock.synchronize do @@ -114,9 +115,6 @@ class Scheduler Fiber.yield - @readable.delete(io) - @writable.delete(io) - return true end @@ -130,10 +128,10 @@ class Scheduler def mutex_unlock(mutex, fiber) @lock.synchronize do @ready << fiber + end - if @urgent - @urgent.last.write('.') - end + if io = @urgent&.last + @urgent.last.write_nonblock('.') end end |