mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
daa1423dea
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5056 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
129 lines
2.3 KiB
Ruby
129 lines
2.3 KiB
Ruby
require 'thread'
|
|
|
|
module Rinda
|
|
class RequestCanceledError < ThreadError; end
|
|
class RequestExpiredError < ThreadError; end
|
|
|
|
class Tuple
|
|
def initialize(ary_or_hash)
|
|
if Hash === ary_or_hash
|
|
init_with_hash(ary_or_hash)
|
|
else
|
|
init_with_ary(ary_or_hash)
|
|
end
|
|
end
|
|
|
|
def size
|
|
@tuple.size
|
|
end
|
|
|
|
def [](k)
|
|
@tuple[k]
|
|
end
|
|
|
|
def each # FIXME
|
|
if Hash === @tuple
|
|
@tuple.each { |k, v| yield(k, v) }
|
|
else
|
|
@tuple.each_with_index { |v, k| yield(k, v) }
|
|
end
|
|
end
|
|
|
|
def value
|
|
@tuple
|
|
end
|
|
|
|
private
|
|
def init_with_ary(ary)
|
|
@tuple_size = ary.size
|
|
@tuple = Array.new(@tuple_size)
|
|
@tuple.size.times do |i|
|
|
@tuple[i] = ary[i]
|
|
end
|
|
end
|
|
|
|
def init_with_hash(hash)
|
|
@tuple_size = hash[:size]
|
|
@tuple = Hash.new
|
|
hash.each do |k, v|
|
|
next unless String === k
|
|
@tuple[k] = v
|
|
end
|
|
end
|
|
end
|
|
|
|
class Template < Tuple
|
|
def match(tuple)
|
|
return false unless tuple.respond_to?(:size)
|
|
return false unless tuple.respond_to?(:[])
|
|
return false if @tuple_size && (@tuple_size != tuple.size)
|
|
each do |k, v|
|
|
next if v.nil?
|
|
return false unless (v === tuple[k] rescue false)
|
|
end
|
|
return true
|
|
end
|
|
|
|
def ===(tuple)
|
|
match(tuple)
|
|
end
|
|
end
|
|
|
|
class DRbObjectTemplate
|
|
def initialize(uri=nil, ref=nil)
|
|
@drb_uri = uri
|
|
@drb_ref = ref
|
|
end
|
|
|
|
def ===(ro)
|
|
return true if super(ro)
|
|
unless @drb_uri.nil?
|
|
return false unless (@drb_uri === ro.__drburi rescue false)
|
|
end
|
|
unless @drb_ref.nil?
|
|
return false unless (@drb_ref === ro.__drbref rescue false)
|
|
end
|
|
true
|
|
end
|
|
end
|
|
|
|
class TupleSpaceProxy
|
|
def initialize(ts)
|
|
@ts = ts
|
|
end
|
|
|
|
def write(tuple, sec=nil)
|
|
@ts.write(tuple, sec)
|
|
end
|
|
|
|
def take(tuple, sec=nil, &block)
|
|
port = []
|
|
@ts.move(DRbObject.new(port), tuple, sec, &block)
|
|
port[0]
|
|
end
|
|
|
|
def read(tuple, sec=nil, &block)
|
|
@ts.read(tuple, sec, &block)
|
|
end
|
|
|
|
def read_all(tuple)
|
|
@ts.read_all(tuple)
|
|
end
|
|
|
|
def notify(ev, tuple, sec=nil)
|
|
@ts.notify(ev, tuple, sec)
|
|
end
|
|
end
|
|
|
|
class SimpleRenewer
|
|
include DRbUndumped
|
|
def initialize(sec=180)
|
|
@sec = sec
|
|
end
|
|
|
|
def renew
|
|
@sec
|
|
end
|
|
end
|
|
end
|
|
|