class Celluloid::IO::Reactor

React to external I/O events. This is kinda sorta supposed to resemble the Reactor design pattern.

Public Class Methods

new() click to toggle source
# File lib/celluloid/io/reactor.rb, line 15
def initialize
  @selector = NIO::Selector.new
end

Public Instance Methods

run_once(timeout = nil) click to toggle source

Run the reactor, waiting for events or wakeup signal

# File lib/celluloid/io/reactor.rb, line 57
def run_once(timeout = nil)
  @selector.select(timeout) do |monitor|
    task = monitor.value

    if task.running?
      task.resume
    else
      Logger.warn("reactor attempted to resume a dead task")
    end
  end
end
wait(io, set) click to toggle source

Wait for the given IO operation to complete

# File lib/celluloid/io/reactor.rb, line 30
def wait(io, set)
  # zomg ugly type conversion :(
  unless io.is_a?(::IO) || io.is_a?(OpenSSL::SSL::SSLSocket)
    if io.respond_to? :to_io
      io = io.to_io
    elsif ::IO.respond_to? :try_convert
      io = ::IO.try_convert(io)
    end

    fail TypeError, "can't convert #{io.class} into IO" unless io.is_a?(::IO)
  end

  monitor = @selector.register(io, set)
  monitor.value = Task.current

  begin
    Task.suspend :iowait
  ensure
    # In all cases we want to ensure that the monitor is closed once we
    # have woken up. However, in some cases, the monitor is already
    # invalid, e.g. in the case that we are terminating. We catch this
    # case explicitly.
    monitor.close unless monitor.closed?
  end
end
wait_readable(io) click to toggle source

Wait for the given IO object to become readable

# File lib/celluloid/io/reactor.rb, line 20
def wait_readable(io)
  wait io, :r
end
wait_writable(io) click to toggle source

Wait for the given IO object to become writable

# File lib/celluloid/io/reactor.rb, line 25
def wait_writable(io)
  wait io, :w
end