123456789_123456789_123456789_123456789_123456789_

Class: DRb::DRbConn

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: lib/drb/drb.rb

Overview

Class handling the connection between a DRbObject and the server the real object lives on.

This class maintains a pool of connections, to reduce the overhead of starting and closing down connections for each method call.

This class is used internally by DRbObject. The user does not normally need to deal with it directly.

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(remote_uri) ⇒ DRbConn

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1317

def initialize(remote_uri)  # :nodoc:
  @uri = remote_uri
  @protocol = DRbProtocol.open(remote_uri, DRb.config)
end

Class Method Details

.make_pool

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1259

def self.make_pool
  ThreadObject.new do |queue|
    pool = []
    while true
      queue._execute do |message|
        case(message[0])
        when :take then
          remote_uri = message[1]
          conn = nil
          new_pool = []
          pool.each do |c|
            if conn.nil? and c.uri == remote_uri
              conn = c if c.alive?
            else
              new_pool.push c
            end
          end
          pool = new_pool
          conn
        when :store then
          conn = message[1]
          pool.unshift(conn)
          pool.pop.close while pool.size > POOL_SIZE
          conn
        else
          nil
        end
      end
    end
  end
end

.open(remote_uri)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1297

def self.open(remote_uri)  # :nodoc:
  begin
    @pool_proxy = make_pool unless @pool_proxy&.alive?

    conn = @pool_proxy.take(remote_uri)
    conn = self.new(remote_uri) unless conn
    succ, result = yield(conn)
    return succ, result

  ensure
    if conn
      if succ
        @pool_proxy.store(conn)
      else
        conn.close
      end
    end
  end
end

.stop_pool

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1292

def self.stop_pool
  @pool_proxy&.kill
  @pool_proxy = nil
end

Instance Attribute Details

#alive?Boolean (readonly)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1333

def alive?  # :nodoc:
  return false unless @protocol
  @protocol.alive?
end

#uri (readonly)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1321

attr_reader :uri  # :nodoc:

Instance Method Details

#close

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1328

def close  # :nodoc:
  @protocol.close
  @protocol = nil
end

#send_message(ref, msg_id, arg, block)

[ GitHub ]

  
# File 'lib/drb/drb.rb', line 1323

def send_message(ref, msg_id, arg, block)  # :nodoc:
  @protocol.send_request(ref, msg_id, arg, block)
  @protocol.recv_reply
end