module Spoon

spoon code taken from Charles Oliver Nutter’s spoon gem github.com/headius/spoon also see blog.headius.com/2009/05/fork-and-exec-on-jvm-jruby-to-rescue.html

Public Class Methods

spawn(*args) click to toggle source
# File lib/raad_totem/spoon.rb, line 19
def self.spawn(*args)
  spawn_args = _prepare_spawn_args(args)
  _posix_spawn(*spawn_args)
  spawn_args[0].read_int
end
spawnp(*args) click to toggle source
# File lib/raad_totem/spoon.rb, line 25
def self.spawnp(*args)
  spawn_args = _prepare_spawn_args(args)
  _posix_spawnp(*spawn_args)
  spawn_args[0].read_int
end

Private Class Methods

_prepare_spawn_args(args) click to toggle source
# File lib/raad_totem/spoon.rb, line 33
def self._prepare_spawn_args(args)
  pid_ptr = FFI::MemoryPointer.new(:pid_t, 1)

  args_ary = FFI::MemoryPointer.new(:pointer, args.length + 1)
  str_ptrs = args.map {|str| FFI::MemoryPointer.from_string(str)}
  args_ary.put_array_of_pointer(0, str_ptrs)

  env_ary = FFI::MemoryPointer.new(:pointer, ENV.length + 1)
  env_ptrs = ENV.map {|key,value| FFI::MemoryPointer.from_string("#{key}=#{value}")}
  env_ary.put_array_of_pointer(0, env_ptrs)
  
  [pid_ptr, args[0], nil, nil, args_ary, env_ary]
end