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