class Invoker::Reactor::Reader

Attributes

read_array[RW]

Public Class Methods

new() click to toggle source
# File lib/invoker/reactor/reader.rb, line 5
def initialize
  @read_array = []
end

Public Instance Methods

handle_read_event(read_ready_fds) click to toggle source
# File lib/invoker/reactor/reader.rb, line 13
def handle_read_event(read_ready_fds)
  ready_fds = read_ready_fds.flatten.compact
  ready_fds.each { |ready_fd| process_read(ready_fd) }
end
watch_for_read(socket) click to toggle source
# File lib/invoker/reactor/reader.rb, line 9
def watch_for_read(socket)
  @read_array << socket
end

Private Instance Methods

process_read(ready_fd) click to toggle source
# File lib/invoker/reactor/reader.rb, line 20
def process_read(ready_fd)
  command_worker = Invoker.commander.get_worker_from_fd(ready_fd)
  begin
    data = read_data(ready_fd)
    send_data_to_worker(data, command_worker)
  rescue Invoker::Errors::ProcessTerminated
    remove_from_read_monitoring(command_worker, ready_fd)
  end
end
read_data(ready_fd) click to toggle source
# File lib/invoker/reactor/reader.rb, line 50
def read_data(ready_fd)
  sock_data = []
  begin
    while(t_data = ready_fd.read_nonblock(64))
      sock_data << t_data
    end
  rescue Errno::EAGAIN
    return sock_data.join
  rescue Errno::EWOULDBLOCK
    return sock_data.join
  rescue
    raise Invoker::Errors::ProcessTerminated.new(ready_fd,sock_data.join)
  end
end
remove_from_read_monitoring(command_worker, ready_fd) click to toggle source
# File lib/invoker/reactor/reader.rb, line 38
def remove_from_read_monitoring(command_worker, ready_fd)
  if command_worker
    read_array.delete(command_worker.pipe_end)
    command_worker.unbind
  else
    read_array.delete(ready_fd)
  end
rescue StandardError => error
  Invoker::Logger.puts(error.message)
  Invoker::Logger.puts(error.backtrace)
end
send_data_to_worker(data, command_worker) click to toggle source
# File lib/invoker/reactor/reader.rb, line 30
def send_data_to_worker(data, command_worker)
  if command_worker
    command_worker.receive_data(data)
  else
    Invoker::Logger.puts("No reader found for incoming data")
  end
end