class Net::SSH::Connection::EventLoop

EventLoop can be shared across multiple sessions

one issue is with blocks passed to loop, etc. they should get current session as parameter, but in case you're using multiple sessions in an event loop it doesnt makes sense and we don't pass session.

Public Class Methods

new(logger=nil) click to toggle source
# File lib/net/ssh/connection/event_loop.rb, line 16
def initialize(logger=nil)
  self.logger = logger
  @sessions = []
end

Public Instance Methods

ev_preprocess() { |self| ... } click to toggle source

Call preprocess on each session. If block given and that block retuns false then we exit the processing

# File lib/net/ssh/connection/event_loop.rb, line 48
def ev_preprocess(&block)
  return false if block_given? && !yield(self)
  @sessions.each(&:ev_preprocess)
  return false if block_given? && !yield(self)
  return true
end
ev_select_and_postprocess(wait) click to toggle source
# File lib/net/ssh/connection/event_loop.rb, line 55
def ev_select_and_postprocess(wait)
  owners = {}
  r = []
  w = []
  minwait = nil
  @sessions.each do |session|
    sr,sw,actwait = session.ev_do_calculate_rw_wait(wait)
    minwait = actwait if actwait && (minwait.nil? || actwait < minwait)
    r.push(*sr)
    w.push(*sw)
    sr.each { |ri| owners[ri] = session }
    sw.each { |wi| owners[wi] = session }
  end
    
  readers, writers, = IO.select(r, w, nil, minwait)
    
  fired_sessions = {}
    
  if readers
    readers.each do |reader|
      session = owners[reader]
      (fired_sessions[session] ||= { r: [],w: [] })[:r] << reader
    end
  end
  if writers
    writers.each do |writer|
      session = owners[writer]
      (fired_sessions[session] ||= { r: [],w: [] })[:w] << writer
    end
  end
    
  fired_sessions.each do |s,rw|
    s.ev_do_handle_events(rw[:r],rw[:w])
  end
    
  @sessions.each { |s| s.ev_do_postprocess(fired_sessions.key?(s)) }
  true
end
process(wait = nil, &block) click to toggle source

process until timeout if a block is given a session will be removed from loop if block returns false for that session

# File lib/net/ssh/connection/event_loop.rb, line 28
def process(wait = nil, &block)
  return false unless ev_preprocess(&block)
    
  ev_select_and_postprocess(wait)
end
process_only(session, wait = nil) click to toggle source

process the event loop but only for the sepcified session

# File lib/net/ssh/connection/event_loop.rb, line 35
def process_only(session, wait = nil)
  orig_sessions = @sessions
  begin
    @sessions = [session]
    return false unless ev_preprocess
    ev_select_and_postprocess(wait)
  ensure
    @sessions = orig_sessions
  end
end
register(session) click to toggle source
# File lib/net/ssh/connection/event_loop.rb, line 21
def register(session)
  @sessions << session
end