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



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

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

#deregister_write(io, listener = nil) ⇒ Object



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

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

#on_next_tick(&handler) ⇒ Object



59
60
61
# File 'lib/eventkit/event_loop.rb', line 59

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

#register_read(io, &listener) ⇒ Object



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

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

#register_timer(options, &handler) ⇒ Object



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

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

#register_write(io, &listener) ⇒ Object



79
80
81
# File 'lib/eventkit/event_loop.rb', line 79

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
56
57
# 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 { |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