From d3cf61b05d9507e7b6ea5a1a1192e107a8612049 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 13 Dec 2015 12:19:00 +0000 Subject: switch to exception-free non-blocking I/O Ruby 2.3 will have `exception: false' support in socket-related classes. Additionally, 2.3 will implement the existing IO#*_nonblock methods more efficiently than before by avoiding the hash allocation necessary for keywords. For users on older Rubies, we'll continue supporting them with compatibility wrappers; even Ruby 1.9.3 users (for now). --- lib/dtas/sigevent/pipe.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'lib/dtas/sigevent/pipe.rb') diff --git a/lib/dtas/sigevent/pipe.rb b/lib/dtas/sigevent/pipe.rb index 4f42909..5dd01a6 100644 --- a/lib/dtas/sigevent/pipe.rb +++ b/lib/dtas/sigevent/pipe.rb @@ -3,11 +3,13 @@ # used in various places for safe wakeups from IO.select via signals # A fallback for non-Linux systems lacking the "sleepy_penguin" RubyGem +require_relative 'nonblock' class DTAS::Sigevent # :nodoc: attr_reader :to_io def initialize - @to_io, @wr = IO.pipe + @to_io, @wr = DTAS::Nonblock.pipe + @rbuf = '' end def signal @@ -15,11 +17,10 @@ class DTAS::Sigevent # :nodoc: end def readable_iter - begin - @to_io.read_nonblock(11) + case @to_io.read_nonblock(11, @rbuf, exception: false) + when :wait_readable then return :wait_readable + else yield self, nil # calls DTAS::Process.reaper - rescue Errno::EAGAIN - return :wait_readable end while true end -- cgit v1.2.3-24-ge0c7