class Async::IO::SharedEndpoint
Pre-connect and pre-bind sockets so that it can be used between processes.
def self.bound(endpoint, backlog = Socket::SOMAXCONN)
def self.bound(endpoint, backlog = Socket::SOMAXCONN) wrappers = endpoint.bound do |server| server.listen(backlog) server.close_on_exec = false server.reactor = nil end return self.new(endpoint, wrappers) end
def self.connected(endpoint)
def self.connected(endpoint) wrapper = endpoint.connect wrapper.close_on_exec = false wrapper.reactor = nil return self.new(endpoint, [wrapper]) end
def accept(backlog = nil, &block)
def accept(backlog = nil, &block) bind do |server| server.accept_each(&block) end end
def bind
def bind task = Async::Task.current @wrappers.each do |server| server = server.dup task.async do |task| task.annotate "binding to #{server.inspect}" begin yield server, task ensure server.close end end end end
def close
def close @wrappers.each(&:close) @wrappers.clear end
def connect
def connect task = Async::Task.current @wrappers.each do |peer| peer = peer.dup task.async do |task| task.annotate "connected to #{peer.inspect} [#{peer.fileno}]" begin yield peer, task ensure peer.close end end end end
def initialize(endpoint, wrappers, **options)
def initialize(endpoint, wrappers, **options) super(**options) @endpoint = endpoint @wrappers = wrappers end
def to_s
def to_s "\#<#{self.class} #{@wrappers.size} descriptors for #{@endpoint}>" end