Class: Henitai::ProcessWakeup
- Inherits:
-
Object
- Object
- Henitai::ProcessWakeup
- Defined in:
- lib/henitai/process_wakeup.rb
Overview
Wakeup pipe used to interrupt child-process wait loops when CHLD arrives.
Instance Method Summary collapse
- #close ⇒ Object
- #drain ⇒ Object
-
#initialize(signal_name: "CHLD") ⇒ ProcessWakeup
constructor
A new instance of ProcessWakeup.
- #install ⇒ Object
- #signal ⇒ Object
- #wait(timeout) ⇒ Object
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
#close ⇒ Object
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 |
#drain ⇒ Object
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 |
#install ⇒ Object
11 12 13 14 |
# File 'lib/henitai/process_wakeup.rb', line 11 def install @previous_handler = Signal.trap(signal_name) { signal } self end |
#signal ⇒ Object
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 |