drb 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +95 -0
- data/Rakefile +17 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/drb.gemspec +30 -0
- data/lib/drb.rb +3 -0
- data/lib/drb/acl.rb +239 -0
- data/lib/drb/drb.rb +1937 -0
- data/lib/drb/eq.rb +15 -0
- data/lib/drb/extserv.rb +44 -0
- data/lib/drb/extservm.rb +92 -0
- data/lib/drb/gw.rb +161 -0
- data/lib/drb/invokemethod.rb +35 -0
- data/lib/drb/observer.rb +26 -0
- data/lib/drb/ssl.rb +344 -0
- data/lib/drb/timeridconv.rb +97 -0
- data/lib/drb/unix.rb +118 -0
- data/lib/drb/version.rb +3 -0
- data/lib/drb/weakidconv.rb +59 -0
- metadata +69 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
require_relative 'drb'
|
3
|
+
require 'monitor'
|
4
|
+
|
5
|
+
module DRb
|
6
|
+
|
7
|
+
# Timer id conversion keeps objects alive for a certain amount of time after
|
8
|
+
# their last access. The default time period is 600 seconds and can be
|
9
|
+
# changed upon initialization.
|
10
|
+
#
|
11
|
+
# To use TimerIdConv:
|
12
|
+
#
|
13
|
+
# DRb.install_id_conv TimerIdConv.new 60 # one minute
|
14
|
+
|
15
|
+
class TimerIdConv < DRbIdConv
|
16
|
+
class TimerHolder2 # :nodoc:
|
17
|
+
include MonitorMixin
|
18
|
+
|
19
|
+
class InvalidIndexError < RuntimeError; end
|
20
|
+
|
21
|
+
def initialize(keeping=600)
|
22
|
+
super()
|
23
|
+
@sentinel = Object.new
|
24
|
+
@gc = {}
|
25
|
+
@renew = {}
|
26
|
+
@keeping = keeping
|
27
|
+
@expires = nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def add(obj)
|
31
|
+
synchronize do
|
32
|
+
rotate
|
33
|
+
key = obj.__id__
|
34
|
+
@renew[key] = obj
|
35
|
+
invoke_keeper
|
36
|
+
return key
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def fetch(key)
|
41
|
+
synchronize do
|
42
|
+
rotate
|
43
|
+
obj = peek(key)
|
44
|
+
raise InvalidIndexError if obj == @sentinel
|
45
|
+
@renew[key] = obj # KeepIt
|
46
|
+
return obj
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def peek(key)
|
52
|
+
return @renew.fetch(key) { @gc.fetch(key, @sentinel) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def invoke_keeper
|
56
|
+
return if @expires
|
57
|
+
@expires = Time.now + @keeping
|
58
|
+
on_gc
|
59
|
+
end
|
60
|
+
|
61
|
+
def on_gc
|
62
|
+
return unless Thread.main.alive?
|
63
|
+
return if @expires.nil?
|
64
|
+
Thread.new { rotate } if @expires < Time.now
|
65
|
+
ObjectSpace.define_finalizer(Object.new) {on_gc}
|
66
|
+
end
|
67
|
+
|
68
|
+
def rotate
|
69
|
+
synchronize do
|
70
|
+
if @expires &.< Time.now
|
71
|
+
@gc = @renew # GCed
|
72
|
+
@renew = {}
|
73
|
+
@expires = @gc.empty? ? nil : Time.now + @keeping
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Creates a new TimerIdConv which will hold objects for +keeping+ seconds.
|
80
|
+
def initialize(keeping=600)
|
81
|
+
@holder = TimerHolder2.new(keeping)
|
82
|
+
end
|
83
|
+
|
84
|
+
def to_obj(ref) # :nodoc:
|
85
|
+
return super if ref.nil?
|
86
|
+
@holder.fetch(ref)
|
87
|
+
rescue TimerHolder2::InvalidIndexError
|
88
|
+
raise "invalid reference"
|
89
|
+
end
|
90
|
+
|
91
|
+
def to_id(obj) # :nodoc:
|
92
|
+
return @holder.add(obj)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# DRb.install_id_conv(TimerIdConv.new)
|
data/lib/drb/unix.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
require 'socket'
|
3
|
+
require_relative 'drb'
|
4
|
+
require 'tmpdir'
|
5
|
+
|
6
|
+
raise(LoadError, "UNIXServer is required") unless defined?(UNIXServer)
|
7
|
+
|
8
|
+
module DRb
|
9
|
+
|
10
|
+
# Implements DRb over a UNIX socket
|
11
|
+
#
|
12
|
+
# DRb UNIX socket URIs look like <code>drbunix:<path>?<option></code>. The
|
13
|
+
# option is optional.
|
14
|
+
|
15
|
+
class DRbUNIXSocket < DRbTCPSocket
|
16
|
+
# :stopdoc:
|
17
|
+
def self.parse_uri(uri)
|
18
|
+
if /\Adrbunix:(.*?)(\?(.*))?\z/ =~ uri
|
19
|
+
filename = $1
|
20
|
+
option = $3
|
21
|
+
[filename, option]
|
22
|
+
else
|
23
|
+
raise(DRbBadScheme, uri) unless uri.start_with?('drbunix:')
|
24
|
+
raise(DRbBadURI, 'can\'t parse uri:' + uri)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.open(uri, config)
|
29
|
+
filename, = parse_uri(uri)
|
30
|
+
soc = UNIXSocket.open(filename)
|
31
|
+
self.new(uri, soc, config)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.open_server(uri, config)
|
35
|
+
filename, = parse_uri(uri)
|
36
|
+
if filename.size == 0
|
37
|
+
soc = temp_server
|
38
|
+
filename = soc.path
|
39
|
+
uri = 'drbunix:' + soc.path
|
40
|
+
else
|
41
|
+
soc = UNIXServer.open(filename)
|
42
|
+
end
|
43
|
+
owner = config[:UNIXFileOwner]
|
44
|
+
group = config[:UNIXFileGroup]
|
45
|
+
if owner || group
|
46
|
+
require 'etc'
|
47
|
+
owner = Etc.getpwnam( owner ).uid if owner
|
48
|
+
group = Etc.getgrnam( group ).gid if group
|
49
|
+
File.chown owner, group, filename
|
50
|
+
end
|
51
|
+
mode = config[:UNIXFileMode]
|
52
|
+
File.chmod(mode, filename) if mode
|
53
|
+
|
54
|
+
self.new(uri, soc, config, true)
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.uri_option(uri, config)
|
58
|
+
filename, option = parse_uri(uri)
|
59
|
+
return "drbunix:#{filename}", option
|
60
|
+
end
|
61
|
+
|
62
|
+
def initialize(uri, soc, config={}, server_mode = false)
|
63
|
+
super(uri, soc, config)
|
64
|
+
set_sockopt(@socket)
|
65
|
+
@server_mode = server_mode
|
66
|
+
@acl = nil
|
67
|
+
end
|
68
|
+
|
69
|
+
# import from tempfile.rb
|
70
|
+
Max_try = 10
|
71
|
+
private
|
72
|
+
def self.temp_server
|
73
|
+
tmpdir = Dir::tmpdir
|
74
|
+
n = 0
|
75
|
+
while true
|
76
|
+
begin
|
77
|
+
tmpname = sprintf('%s/druby%d.%d', tmpdir, $$, n)
|
78
|
+
lock = tmpname + '.lock'
|
79
|
+
unless File.exist?(tmpname) or File.exist?(lock)
|
80
|
+
Dir.mkdir(lock)
|
81
|
+
break
|
82
|
+
end
|
83
|
+
rescue
|
84
|
+
raise "cannot generate tempfile `%s'" % tmpname if n >= Max_try
|
85
|
+
#sleep(1)
|
86
|
+
end
|
87
|
+
n += 1
|
88
|
+
end
|
89
|
+
soc = UNIXServer.new(tmpname)
|
90
|
+
Dir.rmdir(lock)
|
91
|
+
soc
|
92
|
+
end
|
93
|
+
|
94
|
+
public
|
95
|
+
def close
|
96
|
+
return unless @socket
|
97
|
+
shutdown # DRbProtocol#shutdown
|
98
|
+
path = @socket.path if @server_mode
|
99
|
+
@socket.close
|
100
|
+
File.unlink(path) if @server_mode
|
101
|
+
@socket = nil
|
102
|
+
close_shutdown_pipe
|
103
|
+
end
|
104
|
+
|
105
|
+
def accept
|
106
|
+
s = accept_or_shutdown
|
107
|
+
return nil unless s
|
108
|
+
self.class.new(nil, s, @config)
|
109
|
+
end
|
110
|
+
|
111
|
+
def set_sockopt(soc)
|
112
|
+
# no-op for now
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
DRbProtocol.add_protocol(DRbUNIXSocket)
|
117
|
+
# :startdoc:
|
118
|
+
end
|
data/lib/drb/version.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
require_relative 'drb'
|
3
|
+
require 'monitor'
|
4
|
+
|
5
|
+
module DRb
|
6
|
+
|
7
|
+
# To use WeakIdConv:
|
8
|
+
#
|
9
|
+
# DRb.start_service(nil, nil, {:idconv => DRb::WeakIdConv.new})
|
10
|
+
|
11
|
+
class WeakIdConv < DRbIdConv
|
12
|
+
class WeakSet
|
13
|
+
include MonitorMixin
|
14
|
+
def initialize
|
15
|
+
super()
|
16
|
+
@immutable = {}
|
17
|
+
@map = ObjectSpace::WeakMap.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def add(obj)
|
21
|
+
synchronize do
|
22
|
+
begin
|
23
|
+
@map[obj] = self
|
24
|
+
rescue ArgumentError
|
25
|
+
@immutable[obj.__id__] = obj
|
26
|
+
end
|
27
|
+
return obj.__id__
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def fetch(ref)
|
32
|
+
synchronize do
|
33
|
+
@immutable.fetch(ref) {
|
34
|
+
@map.each { |key, _|
|
35
|
+
return key if key.__id__ == ref
|
36
|
+
}
|
37
|
+
raise RangeError.new("invalid reference")
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize()
|
44
|
+
super()
|
45
|
+
@weak_set = WeakSet.new
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_obj(ref) # :nodoc:
|
49
|
+
return super if ref.nil?
|
50
|
+
@weak_set.fetch(ref)
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_id(obj) # :nodoc:
|
54
|
+
return @weak_set.add(obj)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# DRb.install_id_conv(WeakIdConv.new)
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: drb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Masatoshi SEKI
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-12-03 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Distributed object system for Ruby
|
14
|
+
email:
|
15
|
+
- seki@ruby-lang.org
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- ".gitignore"
|
21
|
+
- ".travis.yml"
|
22
|
+
- Gemfile
|
23
|
+
- LICENSE.txt
|
24
|
+
- README.md
|
25
|
+
- Rakefile
|
26
|
+
- bin/console
|
27
|
+
- bin/setup
|
28
|
+
- drb.gemspec
|
29
|
+
- lib/drb.rb
|
30
|
+
- lib/drb/acl.rb
|
31
|
+
- lib/drb/drb.rb
|
32
|
+
- lib/drb/eq.rb
|
33
|
+
- lib/drb/extserv.rb
|
34
|
+
- lib/drb/extservm.rb
|
35
|
+
- lib/drb/gw.rb
|
36
|
+
- lib/drb/invokemethod.rb
|
37
|
+
- lib/drb/observer.rb
|
38
|
+
- lib/drb/ssl.rb
|
39
|
+
- lib/drb/timeridconv.rb
|
40
|
+
- lib/drb/unix.rb
|
41
|
+
- lib/drb/version.rb
|
42
|
+
- lib/drb/weakidconv.rb
|
43
|
+
homepage: https://github.com/ruby/drb
|
44
|
+
licenses:
|
45
|
+
- Ruby
|
46
|
+
- BSD-2-Clause
|
47
|
+
metadata:
|
48
|
+
homepage_uri: https://github.com/ruby/drb
|
49
|
+
source_code_uri: https://github.com/ruby/drb
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
require_paths:
|
53
|
+
- lib
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: 2.3.0
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubygems_version: 3.2.0.rc.2
|
66
|
+
signing_key:
|
67
|
+
specification_version: 4
|
68
|
+
summary: Distributed object system for Ruby
|
69
|
+
test_files: []
|