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



74
75
76
77
78
79
80
# File 'lib/eventkit/event_loop.rb', line 74

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

#deregister_write(io, listener = nil) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/eventkit/event_loop.rb', line 86

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

#on_next_tick(&handler) ⇒ Object



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

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

#register_read(io, &listener) ⇒ Object



70
71
72
# File 'lib/eventkit/event_loop.rb', line 70

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

#register_timer(options, &handler) ⇒ Object



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

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

#register_write(io, &listener) ⇒ Object



82
83
84
# File 'lib/eventkit/event_loop.rb', line 82

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
32
33
34
# 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
    if stop_scheduled?
      @stopped = false
      break
    end
    tick
  end
end

#stopObject



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

def stop
  @stopped = true
  @started = false
end

#stop_scheduled?Boolean

Returns:



41
42
43
# File 'lib/eventkit/event_loop.rb', line 41

def stop_scheduled?
  @stopped
end

#tickObject



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/eventkit/event_loop.rb', line 45

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