class Async::IO::SharedEndpoint
def self.bound(endpoint, backlog = Socket::SOMAXCONN)
def self.bound(endpoint, backlog = Socket::SOMAXCONN) wrappers = [] endpoint.each do |endpoint| server = endpoint.bind server.listen(backlog) server.close_on_exec = false server.reactor = nil wrappers << server end self.new(endpoint, wrappers) end
def self.connected(endpoint)
def self.connected(endpoint) peer = endpoint.connect peer.close_on_exec = false peer.reactor = nil self.new(endpoint, [peer]) 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) 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}" begin yield peer, task ensure peer.close end end end end
def initialize(endpoint, wrappers)
def initialize(endpoint, wrappers) @endpoint = endpoint @wrappers = wrappers end
def to_s
def to_s "\#<#{self.class} #{@wrappers.count} descriptors for #{@endpoint}>" end