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 1316

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 1258

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 1296

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 1291

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

Instance Attribute Details

#alive?Boolean (readonly)

[ GitHub ]

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

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

#uri (readonly)

[ GitHub ]

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

attr_reader :uri  # :nodoc:

Instance Method Details

#close

[ GitHub ]

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

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

#send_message(ref, msg_id, arg, block)

[ GitHub ]

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

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