Class: Sigurd::SignalHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/sigurd/signal_handler.rb

Overview

Class that takes any object with a “start” and “stop” method and catches signals to ask them to stop nicely.

Constant Summary collapse

SIGNALS =
%i(INT TERM QUIT).freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(runner) ⇒ SignalHandler

Takes any object that responds to the ‘start` and `stop` methods.

Parameters:

  • runner (#start, #stop)


12
13
14
15
16
# File 'lib/sigurd/signal_handler.rb', line 12

def initialize(runner)
  @signal_queue = []
  @reader, @writer = IO.pipe
  @runner = runner
end

Instance Attribute Details

#runnerObject (readonly)

Returns the value of attribute runner.



8
9
10
# File 'lib/sigurd/signal_handler.rb', line 8

def runner
  @runner
end

Instance Method Details

#run!Object

Run the runner.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/sigurd/signal_handler.rb', line 19

def run!
  setup_signals
  @runner.start

  loop do
    signal = signal_queue.pop
    case signal
    when *SIGNALS
      @runner.stop
      if Sigurd.exit_on_signal
        exit 0
      else
        raise(SignalException, signal)
      end
    else
      ready = IO.select([reader, writer])

      # drain the self-pipe so it won't be returned again next time
      reader.read_nonblock(1) if ready[0].include?(reader)
    end
  end
end