class Myxi::EventableSocket

Public Class Methods

new(event_loop, socket) click to toggle source
# File lib/myxi/eventable_socket.rb, line 3
def initialize(event_loop, socket)
  @event_loop = event_loop
  @socket = socket
  @monitor = @event_loop.selector.register(@socket, :r)
  @monitor.value = self
  @read_buffer = String.new.force_encoding('BINARY')
  @write_buffer = String.new.force_encoding('BINARY')
end

Public Instance Methods

close() click to toggle source
# File lib/myxi/eventable_socket.rb, line 37
def close
  @socket.close
  @event_loop.selector.deregister(@socket)
end
close_after_write() click to toggle source
# File lib/myxi/eventable_socket.rb, line 32
def close_after_write
  @close_after_write = true
  @monitor.interests = :w
end
handle_w() click to toggle source
# File lib/myxi/eventable_socket.rb, line 12
def handle_w
  bytes_sent = @socket.write_nonblock(@write_buffer)
  # Send as much data as possible
  if bytes_sent >= @write_buffer.bytesize
    @write_buffer = String.new.force_encoding('BINARY')
    @monitor.interests = :r
    close if @close_after_write
  else
    @write_buffer.slice!(0, bytes_sent)
  end
rescue Errno::ECONNRESET, IOError
  close
end
write(data) click to toggle source
# File lib/myxi/eventable_socket.rb, line 26
def write(data)
  @event_loop.wakeup
  @write_buffer << data.force_encoding('BINARY')
  @monitor.interests = :rw
end