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
get_line()
Alias for: readln
gets()
Alias for: readln
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
Also aliased as: get_line, gets
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