class PbActor::Proxy

Public Class Methods

new(origin) click to toggle source
# File lib/pb_actor/proxy.rb, line 8
def initialize origin
  @origin = origin
  pr, cw = IO.pipe
  cr, pw = IO.pipe
  @pid = fork do
    [pr, pw].each &:close
    @future_values = {}
    loop do
      type, id, method, *args = begin
                                  Message.recv cr
                                rescue EOFError => e
                                  [:terminate]
                                end
      case type
      when :async_method_call
        @origin.public_send method, *args
      when :future_method_call
        @future_values[id] = @origin.public_send method, *args
      when :future_value_get
        Message.send(if @future_values.has_key? id
          [:future_value, @future_values.delete(id)]
        else
          [:no_value]
        end, cw)
      when :terminate
        exit
      else
        raise "what happend!? receive #{type.inspect}"
      end
    end
  end
  [cr, cw].each &:close
  @rd = pr
  @wr = pw
  @alive = true
end

Public Instance Methods

async() click to toggle source
# File lib/pb_actor/proxy.rb, line 50
def async
  @async ||= AsyncProxy.new @origin, @pid, @wr, @rd
end
future() click to toggle source
# File lib/pb_actor/proxy.rb, line 54
def future
  @future ||= FutureProxy.new @origin, @pid, @wr, @rd
end
method_missing(method, *args, &blk) click to toggle source
Calls superclass method PbActor::BasicProxy#method_missing
# File lib/pb_actor/proxy.rb, line 45
def method_missing method, *args, &blk
  super
  future.method_missing(method, *args).value
end
terminate() click to toggle source
# File lib/pb_actor/proxy.rb, line 58
def terminate
  raise DeadActorError, PbActor.dead_actor_msg unless alive?
  Message.send [:terminate], @wr
  Process.wait @pid
  nil
rescue Errno::ECHILD => e
  raise DeadActorError, PbActor.dead_actor_msg
end
terminate!() click to toggle source
# File lib/pb_actor/proxy.rb, line 67
def terminate!
  raise DeadActorError, PbActor.dead_actor_msg unless alive?
  Process.kill "KILL", @pid
  Process.wait @pid
  nil
rescue Errno::ECHILD, Errno::ESRCH => e
  raise DeadActorError, PbActor.dead_actor_msg
end