class Pwrake::NBIO::Reader
Attributes
check_timeout[RW]
host[RW]
io[R]
waiter[R]
Public Class Methods
new(selector, io)
click to toggle source
# File lib/pwrake/nbio.rb, line 247 def initialize(selector, io) @selector = selector @io = io @waiter = [] @buf = '' @eof = false @sep = "\n" @chunk_size = 8192 end
Public Instance Methods
_read(sz)
click to toggle source
from Bartender
# File lib/pwrake/nbio.rb, line 316 def _read(sz) @io.read_nonblock(sz) rescue EOFError @eof = true nil rescue IO::WaitReadable return nil if @halting select_io retry end
call()
click to toggle source
call from Selector#run
# File lib/pwrake/nbio.rb, line 260 def call @waiter.each{|f| f.resume} end
eof?()
click to toggle source
# File lib/pwrake/nbio.rb, line 310 def eof? @eof && @buf.empty? end
error(e)
click to toggle source
# File lib/pwrake/nbio.rb, line 298 def error(e) @closed = true raise e end
halt()
click to toggle source
# File lib/pwrake/nbio.rb, line 303 def halt @halting = true call ensure @halting = false end
read(n)
click to toggle source
# File lib/pwrake/nbio.rb, line 327 def read(n) while @buf.bytesize < n chunk = _read(n) break if chunk.nil? || chunk.empty? @buf += chunk end @buf.slice!(0, n) end
read_line_nonblock()
click to toggle source
call from MultiReader#call
# File lib/pwrake/nbio.rb, line 265 def read_line_nonblock until index = @buf.index(@sep) @buf << @io.read_nonblock(@chunk_size) end @buf.slice!(0, index+@sep.bytesize) rescue EOFError => e if @buf.empty? raise e else buf = @buf; @buf = '' return buf end end
read_until(sep="\r\n", chunk_size=8192)
click to toggle source
# File lib/pwrake/nbio.rb, line 336 def read_until(sep="\r\n", chunk_size=8192) until i = @buf.index(sep) if s = _read(chunk_size) @buf += s else if @buf.empty? return nil else buf = @buf; @buf = '' return buf end end end @buf.slice!(0, i+sep.bytesize) end
readln()
click to toggle source
# File lib/pwrake/nbio.rb, line 352 def readln read_until(@sep) end
select_io()
click to toggle source
call from Reader#_read and FiberReaderQueue#deq
# File lib/pwrake/nbio.rb, line 280 def select_io if @waiter.empty? @selector.add_reader(self) else if @selector.reader[@io] != self raise RuntimeError, "access from multiple Fiber" end end @waiter.push(Fiber.current) if $debug && defined? Log Log.debug("Reader#select_io: #{Fiber.current.inspect}\n "+caller.join("\n ")) end Fiber.yield ensure @waiter.delete(Fiber.current) @selector.delete_reader(self) if @waiter.empty? end