class Futurist::ForkingResolutionStrategy

Attributes

channel[R]
forking_method[R]
process_exit[R]
promise[R]
promise_monitor[R]
promise_process_id[R]

Public Class Methods

new(forking_method: Process.method(:fork), process_monitor_constructor: Process.method(:detach), channel: Futurist::Pipe.new, process_exit: Process.method(:exit!), promise:) click to toggle source
# File lib/futurist/forking_resolution_strategy.rb, line 4
def initialize(forking_method: Process.method(:fork),
               process_monitor_constructor: Process.method(:detach),
               channel: Futurist::Pipe.new,
               process_exit: Process.method(:exit!),
               promise:)
  @promise = promise
  @channel = channel
  @forking_method = forking_method
  @value = :not_retrieved
  @process_exit = process_exit
  @promise_process_id = start_promise_evaluation
  @promise_monitor = process_monitor_constructor.call(@promise_process_id)
end

Public Instance Methods

resolve() click to toggle source
# File lib/futurist/forking_resolution_strategy.rb, line 18
def resolve
  if @value == :not_retrieved
    @value = read_promise_value
  end
  @value
end
resolved?() click to toggle source
# File lib/futurist/forking_resolution_strategy.rb, line 25
def resolved?
  !promise_monitor.alive?
end

Private Instance Methods

read_promise_value() click to toggle source
# File lib/futurist/forking_resolution_strategy.rb, line 47
def read_promise_value
  channel.close_writer
  value = channel.read
  channel.close_reader
  if value.is_a?(Exception)
    raise value
  end
  value
end
start_promise_evaluation() click to toggle source
# File lib/futurist/forking_resolution_strategy.rb, line 37
def start_promise_evaluation
  forking_method.call do
    channel.close_reader
    safe_promise = SafePromise.new(promise)
    channel.write(safe_promise.value)
    channel.close_writer
    process_exit.call(0)
  end
end