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