In Files

  • drb/drb.rb
  • drb/eq.rb
  • drb/gw.rb

Object::DRbObject

Object wrapping a reference to a remote drb object.

Method calls on this object are relayed to the remote object that this object is a stub for.

Public Class Methods

_load(s) click to toggle source

Unmarshall a marshalled DRbObject.

If the referenced object is located within the local server, then the object itself is returned. Otherwise, a new DRbObject is created to act as a stub for the remote referenced object.

 
               # File drb/drb.rb, line 1003
def self._load(s)
  uri, ref = Marshal.load(s)
  
  if DRb.here?(uri)
    obj = DRb.to_obj(ref)
    if ((! obj.tainted?) && Thread.current[:drb_untaint])
      Thread.current[:drb_untaint].push(obj)
    end
    return obj
  end

  self.new_with(uri, ref)
end
            
new(obj, uri=nil) click to toggle source

Create a new remote object stub.

obj is the (local) object we want to create a stub for. Normally this is nil. uri is the URI of the remote object that this will be a stub for.

 
               # File drb/drb.rb, line 1041
def initialize(obj, uri=nil)
  @uri = nil
  @ref = nil
  if obj.nil?
    return if uri.nil?
    @uri, option = DRbProtocol.uri_option(uri, DRb.config)
    @ref = DRbURIOption.new(option) unless option.nil?
  else
    @uri = uri ? uri : (DRb.uri rescue nil)
    @ref = obj ? DRb.to_id(obj) : nil
  end
end
            
new_with(uri, ref) click to toggle source
 
               # File drb/drb.rb, line 1017
def self.new_with(uri, ref)
  it = self.allocate
  it.instance_variable_set('@uri', uri)
  it.instance_variable_set('@ref', ref)
  it
end
            
new_with_uri(uri) click to toggle source

Create a new DRbObject from a URI alone.

 
               # File drb/drb.rb, line 1025
def self.new_with_uri(uri)
  self.new(nil, uri)
end
            
prepare_backtrace(uri, result) click to toggle source
 
               # File drb/drb.rb, line 1114
def self.prepare_backtrace(uri, result)
  prefix = "(#{uri}) "
  bt = []
  result.backtrace.each do |x|
    break if /`__send__'$/ =~ x 
    if /^\(druby:\/\// =~ x
      bt.push(x)
    else
      bt.push(prefix + x)
    end
  end
  bt
end
            
with_friend(uri) click to toggle source
 
               # File drb/drb.rb, line 1103
def self.with_friend(uri)
  friend = DRb.fetch_server(uri)
  return yield() unless friend
  
  save = Thread.current['DRb']
  Thread.current['DRb'] = { 'server' => friend }
  return yield
ensure
  Thread.current['DRb'] = save if friend
end
            

Public Instance Methods

==(other) click to toggle source
 
               # File drb/eq.rb, line 5
def ==(other)
  return false unless DRbObject === other
 (@ref == other.__drbref) && (@uri == other.__drburi)
end
            
Also aliased as: eql?
__drbref() click to toggle source

Get the reference of the object, if local.

 
               # File drb/drb.rb, line 1060
def __drbref
  @ref
end
            
__drburi() click to toggle source

Get the URI of the remote object.

 
               # File drb/drb.rb, line 1055
def __drburi 
  @uri
end
            
_dump(lv) click to toggle source

Marshall this object.

The URI and ref of the object are marshalled.

 
               # File drb/drb.rb, line 1032
def _dump(lv)
  Marshal.dump([@uri, @ref])
end
            
eql?(other) click to toggle source
Alias for: ==
hash() click to toggle source
 
               # File drb/eq.rb, line 10
def hash
  [@uri, @ref].hash
end
            
method_missing(msg_id, *a, &b) click to toggle source

Routes method calls to the referenced object.

 
               # File drb/drb.rb, line 1079
def method_missing(msg_id, *a, &b)
  if DRb.here?(@uri)
    obj = DRb.to_obj(@ref)
    DRb.current_server.check_insecure_method(obj, msg_id)
    return obj.__send__(msg_id, *a, &b) 
  end

  succ, result = self.class.with_friend(@uri) do
    DRbConn.open(@uri) do |conn|
      conn.send_message(self, msg_id, a, b)
    end
  end

  if succ
    return result
  elsif DRbUnknown === result
    raise result
  else
    bt = self.class.prepare_backtrace(@uri, result)
    result.set_backtrace(bt + caller)
    raise result
  end
end
            
respond_to?(msg_id, priv=false) click to toggle source
 
               # File drb/drb.rb, line 1067
def respond_to?(msg_id, priv=false)
  case msg_id
  when :_dump
    true
  when :marshal_dump
    false
  else
    method_missing(:respond_to?, msg_id, priv)
  end
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus