3 # Copyright (c) 1999-2000 Masatoshi SEKI
4 # You can redistribute it and/or modify it under the same terms as Ruby.
11 @list.each_with_index do |x, i|
12 @check_idx.push i if x
21 return nil if tuple.size != self.size
22 @check_idx.each do |i|
23 unless @list[i] === tuple[i]
34 @que.taint # enable tainted communication
39 def wakeup_waiting(tuple)
41 return nil unless @waiting[sz]
46 @waiting[sz] = @waiting[sz].find_all { |x|
59 def put_waiting(template, thread)
61 @waiting[sz] = [] unless @waiting[sz]
62 @waiting[sz].push([Template.new(template), thread])
64 private :wakeup_waiting
69 return nil unless @que[sz]
71 template = Template.new(template)
76 @que[sz].each_with_index do |x, i|
82 return nil unless found
91 @que[sz] = [] unless @que[sz]
98 tuples.each do |tuple|
99 Thread.critical = true
101 wakeup_waiting(tuple)
102 Thread.critical = false
108 def in(template, non_block=false)
111 Thread.critical = true
112 tuple = get_que(template)
115 raise ThreadError, "queue empty"
117 put_waiting(template, Thread.current)
124 Thread.critical = false
130 def rd(template, non_block=false)
131 tuple = self.in(template, non_block)
137 def mv(dest, template, non_block=false)
138 tuple = self.in(template, non_block)
156 req = ts.in(['req', nil, nil])
160 ts.out([ac, id, num, num * num])
168 tuples = (1..10).collect { |i|
169 ['req', ac, i * 10 + n]
175 ans = ts.in([ac, nil, nil, nil])
176 puts "client(#{n}) server(#{ans[1]}) #{ans[2]} #{ans[3]}"
186 p ts.rd(['req', nil, nil], true)
188 puts "'req' not found."
195 servers.push(server(ts, n))
199 clients.push(client(ts, n))