class Eventkit::EventLoop

Constants

VERSION

Attributes

select_interval[R]

Public Class Methods

new(config = {}) click to toggle source
# File lib/eventkit/event_loop.rb, line 12
def initialize(config = {})
  @read_handlers = Hash.new { |h, k| h[k] = [] }
  @write_handlers = Hash.new { |h, k| h[k] = [] }
  @select_interval = config.fetch(:select_interval, 1 / 100_000)
  @timers = SortedSet.new
  @stopped = false
  @started = false
end

Public Instance Methods

deregister_read(io, listener = nil) click to toggle source
# File lib/eventkit/event_loop.rb, line 75
def deregister_read(io, listener = nil)
  if listener
    @read_handlers[io] -= [listener]
  else
    @read_handlers[io] = []
  end
end
deregister_write(io, listener = nil) click to toggle source
# File lib/eventkit/event_loop.rb, line 87
def deregister_write(io, listener = nil)
  if listener
    @write_handlers[io] -= [listener]
  else
    @write_handlers[io] = []
  end
end
on_next_tick(&handler) click to toggle source
# File lib/eventkit/event_loop.rb, line 63
def on_next_tick(&handler)
  register_timer(run_in: 0, &handler)
end
register_read(io, &listener) click to toggle source
# File lib/eventkit/event_loop.rb, line 71
def register_read(io, &listener)
  @read_handlers[io] += [listener]
end
register_timer(options, &handler) click to toggle source
# File lib/eventkit/event_loop.rb, line 67
def register_timer(options, &handler)
  @timers << Timer.new(options.fetch(:run_in), handler)
end
register_write(io, &listener) click to toggle source
# File lib/eventkit/event_loop.rb, line 83
def register_write(io, &listener)
  @write_handlers[io] += [listener]
end
start(&_block) click to toggle source
# File lib/eventkit/event_loop.rb, line 21
def start(&_block)
  if @started
    fail EventLoopAlreadyStartedError, 'This event loop instance has already started running'
  else
    @started = true
  end

  loop do
    if stop_scheduled?
      @stopped = false
      break
    end
    tick
  end
end
stop() click to toggle source
# File lib/eventkit/event_loop.rb, line 37
def stop
  @stopped = true
  @started = false
end
stop_scheduled?() click to toggle source
# File lib/eventkit/event_loop.rb, line 42
def stop_scheduled?
  @stopped
end
tick() click to toggle source
# File lib/eventkit/event_loop.rb, line 46
def tick
  ready_read, ready_write, _ = IO.select(@read_handlers.keys, @write_handlers.keys, [], select_interval)
  ready_read.each { |io|
    @read_handlers.fetch(io).each { |handler| handler.call(io) }
  } if ready_read

  ready_write.each { |io|
    @write_handlers.fetch(io).each { |handler| handler.call(io) }
  } if ready_write

  @timers.select(&:expired?).each { |timer|
    timer.handler.call
    @timers.delete(timer)
  }
  nil
end