david-mccullars/safe_timeout

View on GitHub
lib/safe_timeout/interrupting_child_process.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
module SafeTimeout
  class InterruptingChildProcess

    def initialize(expiration)
      @ppid = Process.ppid
      @expiration = expiration.to_f

      abort "Invalid pid to monitor: #{@ppid}" if @ppid.to_i.zero?
      abort "Invalid expiration: #{@expiration}" unless @expiration > 0.0
    end

    def notify_parent_of_expiration
      SafeTimeout.send_signal('TRAP', @ppid)
    end

    def wait_for_timeout
      Signal.trap('HUP') { exit 0 }

      sleep [@expiration - Time.now.to_f, 0.1].max

      notify_parent_of_expiration
    end

  end
end