mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
fix Rinda::TupleSpace keeper thread bug.
the thread is started too early. [ruby-talk:264062] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@12919 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
3a0e807df3
commit
135bb57174
3 changed files with 30 additions and 5 deletions
|
@ -449,7 +449,6 @@ module Rinda
|
|||
|
||||
def write(tuple, sec=nil)
|
||||
entry = create_entry(tuple, sec)
|
||||
start_keeper
|
||||
synchronize do
|
||||
if entry.expired?
|
||||
@read_waiter.find_all_template(entry).each do |template|
|
||||
|
@ -459,6 +458,7 @@ module Rinda
|
|||
notify_event('delete', entry.value)
|
||||
else
|
||||
@bag.push(entry)
|
||||
start_keeper if entry.expires
|
||||
@read_waiter.find_all_template(entry).each do |template|
|
||||
template.read(tuple)
|
||||
end
|
||||
|
@ -484,7 +484,6 @@ module Rinda
|
|||
def move(port, tuple, sec=nil)
|
||||
template = WaitTemplateEntry.new(self, tuple, sec)
|
||||
yield(template) if block_given?
|
||||
start_keeper
|
||||
synchronize do
|
||||
entry = @bag.find(template)
|
||||
if entry
|
||||
|
@ -497,6 +496,7 @@ module Rinda
|
|||
|
||||
begin
|
||||
@take_waiter.push(template)
|
||||
start_keeper if template.expires
|
||||
while true
|
||||
raise RequestCanceledError if template.canceled?
|
||||
raise RequestExpiredError if template.expired?
|
||||
|
@ -521,7 +521,6 @@ module Rinda
|
|||
def read(tuple, sec=nil)
|
||||
template = WaitTemplateEntry.new(self, tuple, sec)
|
||||
yield(template) if block_given?
|
||||
start_keeper
|
||||
synchronize do
|
||||
entry = @bag.find(template)
|
||||
return entry.value if entry
|
||||
|
@ -529,6 +528,7 @@ module Rinda
|
|||
|
||||
begin
|
||||
@read_waiter.push(template)
|
||||
start_keeper if template.expires
|
||||
template.wait
|
||||
raise RequestCanceledError if template.canceled?
|
||||
raise RequestExpiredError if template.expired?
|
||||
|
@ -615,8 +615,11 @@ module Rinda
|
|||
def start_keeper
|
||||
return if @keeper && @keeper.alive?
|
||||
@keeper = Thread.new do
|
||||
while need_keeper?
|
||||
keep_clean
|
||||
while true
|
||||
synchronize do
|
||||
break unless need_keeper?
|
||||
keep_clean
|
||||
end
|
||||
sleep(@period)
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue