mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
import drb/sample
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@5698 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2766990624
commit
a686414ef5
44 changed files with 1966 additions and 0 deletions
91
sample/drb/simpletuple.rb
Normal file
91
sample/drb/simpletuple.rb
Normal file
|
@ -0,0 +1,91 @@
|
|||
#!/usr/local/bin/ruby
|
||||
# SimpleTupleSpace
|
||||
# Copyright (c) 1999-2000 Masatoshi SEKI
|
||||
# You can redistribute it and/or modify it under the same terms as Ruby.
|
||||
|
||||
require 'thread'
|
||||
|
||||
class SimpleTupleSpace
|
||||
def initialize
|
||||
@hash = {}
|
||||
@waiting = {}
|
||||
@hash.taint
|
||||
@waiting.taint
|
||||
self.taint
|
||||
end
|
||||
|
||||
def out(key, obj)
|
||||
Thread.critical = true
|
||||
@hash[key] ||= []
|
||||
@waiting[key] ||= []
|
||||
@hash[key].push obj
|
||||
begin
|
||||
t = @waiting[key].shift
|
||||
@waiting.delete(key) if @waiting[key].length == 0
|
||||
t.wakeup if t
|
||||
rescue ThreadError
|
||||
retry
|
||||
ensure
|
||||
Thread.critical = false
|
||||
end
|
||||
end
|
||||
|
||||
def in(key)
|
||||
Thread.critical = true
|
||||
@hash[key] ||= []
|
||||
@waiting[key] ||= []
|
||||
begin
|
||||
loop do
|
||||
if @hash[key].length == 0
|
||||
@waiting[key].push Thread.current
|
||||
Thread.stop
|
||||
else
|
||||
return @hash[key].shift
|
||||
end
|
||||
end
|
||||
ensure
|
||||
@hash.delete(key) if @hash[key].length == 0
|
||||
Thread.critical = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if __FILE__ == $0
|
||||
ts = SimpleTupleSpace.new
|
||||
clients = []
|
||||
servers = []
|
||||
|
||||
def server(ts)
|
||||
Thread.start {
|
||||
loop do
|
||||
req = ts.in('req')
|
||||
ac = req[0]
|
||||
num = req[1]
|
||||
ts.out(ac, num * num)
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
def client(ts, n)
|
||||
Thread.start {
|
||||
ac = Object.new
|
||||
ts.out('req', [ac, n])
|
||||
ans = ts.in(ac)
|
||||
puts "#{n}: #{ans}"
|
||||
}
|
||||
end
|
||||
|
||||
3.times do
|
||||
servers.push(server(ts))
|
||||
end
|
||||
|
||||
(1..6).each do |n|
|
||||
clients.push(client(ts, n))
|
||||
end
|
||||
|
||||
clients.each do |t|
|
||||
t.join
|
||||
end
|
||||
end
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue