class Pwrake::NBIO::Writer

Attributes

host[RW]
io[R]

Public Class Methods

new(selector, io) click to toggle source
# File lib/pwrake/nbio.rb, line 150
def initialize(selector, io)
  @selector = selector
  @io = io
  @waiter = []
  @pool = []
end

Public Instance Methods

call() click to toggle source

call from Selector

# File lib/pwrake/nbio.rb, line 160
def call
  w = @waiter
  @waiter = []
  w.each{|f| f.resume}
ensure
  @selector.delete_writer(self) if @waiter.empty?
end
error(e) click to toggle source
# File lib/pwrake/nbio.rb, line 182
def error(e)
  @closed = true
  raise e
end
flush() click to toggle source
# File lib/pwrake/nbio.rb, line 200
def flush
  until @pool.empty?
    len = _write(@pool[0])
    pop(len)
  end
end
halt() click to toggle source
# File lib/pwrake/nbio.rb, line 175
def halt
  @halting = true
  call
ensure
  @halting = false
end
print(buf, buffered=false)
Alias for: write
put_line(line, ch=nil) click to toggle source

call from Fiber context

# File lib/pwrake/nbio.rb, line 169
def put_line(line, ch=nil)
  line = line.chomp
  line = "#{ch}:#{line}" if ch
  write(line+"\n")
end
puts(s) click to toggle source
# File lib/pwrake/nbio.rb, line 196
def puts(s)
  write(s+"\n")
end
select_io() click to toggle source
# File lib/pwrake/nbio.rb, line 207
def select_io
  @selector.add_writer(self) if @waiter.empty?
  @waiter.push(Fiber.current)
  Fiber.yield
end
write(buf, buffered=false) click to toggle source

from Bartender

# File lib/pwrake/nbio.rb, line 189
def write(buf, buffered=false)
  push(buf)
  flush unless buffered
end
Also aliased as: print

Private Instance Methods

_write(buf) click to toggle source
# File lib/pwrake/nbio.rb, line 214
def _write(buf)
  return @io.write_nonblock(buf)
rescue IO::WaitWritable
  return nil if @halting
  select_io
  retry
end
pop(size) click to toggle source
# File lib/pwrake/nbio.rb, line 228
def pop(size)
  return if size < 0
  raise if @pool[0].bytesize < size

  if @pool[0].bytesize == size
    @pool.shift
  else
    unless @pool[0].encoding == Encoding::BINARY
      @pool[0] = @pool[0].dup.force_encoding(Encoding::BINARY)
    end
    @pool[0].slice!(0...size)
  end
end
push(string) click to toggle source
# File lib/pwrake/nbio.rb, line 222
def push(string)
  if string.bytesize > 0
    @pool << string
  end
end