Parent

Spork::Forker

A helper class that allows you to run a block inside of a fork, and then get the result from that block.

Example:

  forker = Spork::Forker.new do
    sleep 3
    "success"
  end
  
  forker.result # => "success"

Public Class Methods

new(&block) click to toggle source
    # File lib/spork/forker.rb, line 15
15:   def initialize(&block)
16:     return unless block_given?
17:     @child_io, @server_io = UNIXSocket.socketpair
18:     @child_pid = Kernel.fork do
19:       begin
20:         @server_io.close
21:         Marshal.dump(yield, @child_io)
22:         # wait for the parent to acknowledge receipt of the result.
23:         master_response = Marshal.load(@child_io)
24:       rescue EOFError
25:         nil
26:       rescue Exception => e
27:         puts "Exception encountered: #{e.inspect}\nbacktrace:\n#{e.backtrace * %(\n)}"
28:       end
29:       
30:       # terminate, skipping any at_exit blocks.
31:       exit!(0)
32:     end
33:     @child_io.close
34:   end

Public Instance Methods

abort() click to toggle source

abort the current running fork

    # File lib/spork/forker.rb, line 56
56:   def abort
57:     if running?
58:       Process.kill(Signal.list['TERM'], @child_pid)
59:       @child_pid = nil
60:       true
61:     end
62:   end
result() click to toggle source

Wait for the fork to finish running, and then return its return value.

If the fork was aborted, then result returns nil.

    # File lib/spork/forker.rb, line 39
39:   def result
40:     return unless running?
41:     result_thread = Thread.new do
42:       begin
43:         @result = Marshal.load(@server_io)
44:         Marshal.dump('ACK', @server_io)
45:       rescue ForkDiedException, EOFError
46:         @result = nil
47:       end
48:     end
49:     Process.wait(@child_pid)
50:     result_thread.raise(ForkDiedException) if @result.nil?
51:     @child_pid = nil
52:     @result
53:   end
running?() click to toggle source
    # File lib/spork/forker.rb, line 64
64:   def running?
65:     return false unless @child_pid
66:     Process.getpgid(@child_pid)
67:     true
68:   rescue Errno::ESRCH
69:     false
70:   end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.