From 156bce1e6349fd6ae921bad59ad0b93081946b0c Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 27 Dec 2013 08:08:50 +0000 Subject: player: optimize away some more select calls This keeps us from doing an extra IO.select when we know the sink buffer is readable (as we just registered a sink as writable). --- lib/dtas/unix_server.rb | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib/dtas/unix_server.rb') diff --git a/lib/dtas/unix_server.rb b/lib/dtas/unix_server.rb index 3931239..49437f3 100644 --- a/lib/dtas/unix_server.rb +++ b/lib/dtas/unix_server.rb @@ -69,6 +69,11 @@ class DTAS::UNIXServer # :nodoc: def wait_ctl(io, err) case err + when :hot_read + # this is only safe when we're iterating through ready writers + # the linear search for Array#include? is not expensive since + # we usually don't have a lot of sinks. + @hot_read << io unless @hot_read.include?(io) when :wait_readable @readers[io] = true when :wait_writable @@ -95,10 +100,12 @@ class DTAS::UNIXServer # :nodoc: def run_once # give IO.select one-shot behavior, snapshot and replace the watchlist r = IO.select(@readers.keys, @writers.keys) or return + @hot_read = r[0] r[1].each do |io| @writers.delete(io) wait_ctl(io, io.writable_iter) end + @hot_read = nil r[0].each do |io| @readers.delete(io) wait_ctl(io, io.readable_iter { |_io, msg| yield(_io, msg) }) -- cgit v1.2.3-24-ge0c7