Class: Eventkit::EventLoop

Inherits:
Object
  • Object
show all
Defined in:
lib/eventkit/event_loop.rb

Instance Method Summary collapse

Constructor Details

#initialize(config = {}) ⇒ EventLoop

Returns a new instance of EventLoop.



11
12
13
14
15
16
17
18
# File 'lib/eventkit/event_loop.rb', line 11

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

Instance Method Details

#deregister_read(io, listener = nil) ⇒ Object



69
70
71
72
73
74
75
# File 'lib/eventkit/event_loop.rb', line 69

def deregister_read(io, listener = nil)
  if listener
    @read_handlers[io] -= [listener]
  else
    @read_handlers[io] = []
  end
end

#deregister_write(io, listener = nil) ⇒ Object



81
82
83
84
85
86
87
# File 'lib/eventkit/event_loop.rb', line 81

def deregister_write(io, listener = nil)
  if listener
    @write_handlers[io] -= [listener]
  else
    @write_handlers[io] = []
  end
end

#on_next_tick(&handler) ⇒ Object



57
58
59
# File 'lib/eventkit/event_loop.rb', line 57

def on_next_tick(&handler)
  register_timer(run_in: 0, &handler)
end

#register_read(io, &listener) ⇒ Object



65
66
67
# File 'lib/eventkit/event_loop.rb', line 65

def register_read(io, &listener)
  @read_handlers[io] += [listener]
end

#register_timer(run_in:, &handler) ⇒ Object



61
62
63
# File 'lib/eventkit/event_loop.rb', line 61

def register_timer(run_in:, &handler)
  @timers << Timer.new(run_in, handler)
end

#register_write(io, &listener) ⇒ Object



77
78
79
# File 'lib/eventkit/event_loop.rb', line 77

def register_write(io, &listener)
  @write_handlers[io] += [listener]
end

#start(&_block) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/eventkit/event_loop.rb', line 20

def start(&_block)
  if @started
    fail EventLoopAlreadyStartedError, 'This event loop instance has already started running'
  else
    @started = true
  end

  loop do
    break if stopped?
    tick
  end
end

#stopObject



33
34
35
36
# File 'lib/eventkit/event_loop.rb', line 33

def stop
  @stopped = true
  @started = false
end

#stopped?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/eventkit/event_loop.rb', line 38

def stopped?
  @stopped
end

#tickObject



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/eventkit/event_loop.rb', line 42

def tick
  ready_read, ready_write, _ = IO.select(@read_handlers.keys, @write_handlers.keys, [], select_interval)
  ready_read.each do |io|
    @read_handlers.fetch(io).each { |handler| handler.call(io) }
  end if ready_read

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

  @timers.each { |timer| timer.handler.call if timer.expired? }
  @timers = @timers.reject(&:expired?)
  nil
end