mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
d0ed935d5b
* Handle BasicObject in drb Also fix a bug in rescue clause of any_to_s because sprintf does not handle the %l modifier. Fixes [Bug #7833] * Do not send a reply to the client if there is a connection error This allows for normal TCP shutdown (fin-ack-fin-ack instead of fin-ack-push-rst). Patch from pierre@mouraf.org (Pierre-Alexandre Meyer). Fixes [Bug #2339] * Detect fork and do not reuse forked connections in drb This associates each DRbConn with a pid, and if the pid changes, it closes any DRbConns in the pool with a pid that no longer matches. This fixes DRb servers from sending messages intended for one client to another client after forking. Fixes [Bug #2718] Fixes [Bug #14471]
177 lines
2.4 KiB
Ruby
177 lines
2.4 KiB
Ruby
# frozen_string_literal: false
|
|
require 'drb/drb'
|
|
require 'drb/extserv'
|
|
require 'timeout'
|
|
|
|
module DRbTests
|
|
|
|
class XArray < Array
|
|
def initialize(ary)
|
|
ary.each do |x|
|
|
self.push(x)
|
|
end
|
|
end
|
|
end
|
|
|
|
class XArray2 < XArray
|
|
include DRbUndumped
|
|
end
|
|
|
|
class Unknown2
|
|
def initialize
|
|
@foo = 'unknown2'
|
|
end
|
|
end
|
|
|
|
class DRbEx
|
|
include DRbUndumped
|
|
|
|
class FooBar
|
|
def initialize
|
|
@foo = 'bar'
|
|
end
|
|
end
|
|
|
|
class UError < RuntimeError; end
|
|
|
|
def initialize
|
|
@xary2_hash = nil
|
|
@hash = nil
|
|
@hello = 'hello'
|
|
end
|
|
attr_reader :hello
|
|
|
|
def sample(a, b, c)
|
|
a.to_i + b.to_i + c.to_i
|
|
end
|
|
|
|
def sum(*a)
|
|
s = 0
|
|
a.each do |e|
|
|
s += e.to_i
|
|
end
|
|
s
|
|
end
|
|
|
|
def do_timeout(n)
|
|
Timeout.timeout(0.1) do
|
|
n.sleep(2)
|
|
end
|
|
end
|
|
|
|
def unknown_module
|
|
FooBar.new
|
|
end
|
|
|
|
class BO < ::BasicObject
|
|
def foo; 1 end
|
|
protected def prot; 2; end
|
|
private def priv; 3; end
|
|
end
|
|
def basic_object
|
|
BO.new
|
|
end
|
|
|
|
def unknown_class
|
|
Unknown2.new
|
|
end
|
|
|
|
def unknown_error
|
|
raise UError
|
|
end
|
|
|
|
def remote_no_method_error
|
|
invoke_no_method(self)
|
|
end
|
|
|
|
def test_yield
|
|
yield
|
|
yield([])
|
|
yield(*[])
|
|
end
|
|
|
|
def echo_yield(*arg)
|
|
yield(*arg)
|
|
nil
|
|
end
|
|
|
|
def echo_yield_0
|
|
yield
|
|
nil
|
|
end
|
|
|
|
def echo_yield_1(one)
|
|
yield(one)
|
|
nil
|
|
end
|
|
|
|
def echo_yield_2(one, two)
|
|
yield(one, two)
|
|
nil
|
|
end
|
|
|
|
def xarray_each
|
|
xary = [XArray.new([0])]
|
|
xary.each do |x|
|
|
yield(x)
|
|
end
|
|
nil
|
|
end
|
|
|
|
def xarray2_hash
|
|
unless @xary2_hash
|
|
@xary2_hash = { "a" => XArray2.new([0]), "b" => XArray2.new([1]) }
|
|
end
|
|
DRbObject.new(@xary2_hash)
|
|
end
|
|
|
|
def simple_hash
|
|
unless @hash
|
|
@hash = { 'a'=>:a, 'b'=>:b }
|
|
end
|
|
DRbObject.new(@hash)
|
|
end
|
|
|
|
def [](key)
|
|
key.to_s
|
|
end
|
|
|
|
def to_a
|
|
[self]
|
|
end
|
|
|
|
def method_missing(msg, *a, &b)
|
|
if msg == :missing
|
|
return true
|
|
else
|
|
super(msg, *a, &b)
|
|
end
|
|
end
|
|
|
|
private
|
|
def call_private_method
|
|
true
|
|
end
|
|
|
|
protected
|
|
def call_protected_method
|
|
true
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
if __FILE__ == $0
|
|
def ARGV.shift
|
|
it = super()
|
|
raise "usage: #{$0} <manager-uri> <name>" unless it
|
|
it
|
|
end
|
|
|
|
DRb::DRbServer.default_argc_limit(8)
|
|
DRb::DRbServer.default_load_limit(4096)
|
|
DRb.start_service('druby://localhost:0', DRbTests::DRbEx.new)
|
|
es = DRb::ExtServ.new(ARGV.shift, ARGV.shift)
|
|
DRb.thread.join
|
|
es.stop_service if es.alive?
|
|
end
|