Class: Henitai::ProcessWakeup

Inherits:
Object
  • Object
show all
Defined in:
lib/henitai/process_wakeup.rb

Overview

Wakeup pipe used to interrupt child-process wait loops when CHLD arrives.

Instance Method Summary collapse

Constructor Details

#initialize(signal_name: "CHLD") ⇒ ProcessWakeup

Returns a new instance of ProcessWakeup.



6
7
8
9
# File 'lib/henitai/process_wakeup.rb', line 6

def initialize(signal_name: "CHLD")
  @signal_name = signal_name
  @reader, @writer = IO.pipe
end

Instance Method Details

#closeObject



38
39
40
41
42
43
# File 'lib/henitai/process_wakeup.rb', line 38

def close
  Signal.trap(signal_name, previous_handler) if previous_handler
ensure
  reader.close unless reader.closed?
  writer.close unless writer.closed?
end

#drainObject



24
25
26
27
28
29
30
# File 'lib/henitai/process_wakeup.rb', line 24

def drain
  loop do
    reader.read_nonblock(4096)
  end
rescue IO::WaitReadable, EOFError
  nil
end

#installObject



11
12
13
14
# File 'lib/henitai/process_wakeup.rb', line 11

def install
  @previous_handler = Signal.trap(signal_name) { signal }
  self
end

#signalObject



32
33
34
35
36
# File 'lib/henitai/process_wakeup.rb', line 32

def signal
  writer.write_nonblock(".")
rescue IO::WaitWritable, IOError, Errno::EPIPE
  nil
end

#wait(timeout) ⇒ Object



16
17
18
19
20
21
22
# File 'lib/henitai/process_wakeup.rb', line 16

def wait(timeout)
  # rubocop:disable Lint/IncompatibleIoSelectWithFiberScheduler
  IO.select([reader], nil, nil, timeout)
  # rubocop:enable Lint/IncompatibleIoSelectWithFiberScheduler
rescue Errno::EINTR
  nil
end