Skip to content

Commit e66f118

Browse files
committed
* lib/rinda/tuplespace.rb: fix Rinda::TupleSpace keeper thread bug.
the thread is started too early. [ruby-talk:264062] * test/rinda/test_rinda.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@13222 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 679e43e commit e66f118

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

ChangeLog

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
Sun Arg 12 03:56:30 2007 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
2+
3+
* lib/rinda/tuplespace.rb: fix Rinda::TupleSpace keeper thread bug.
4+
the thread is started too early. [ruby-talk:264062]
5+
6+
* test/rinda/test_rinda.rb: ditto.
7+
18
Wed Aug 22 12:31:15 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
29

310
* configure.in (ac_cv_func_isinf): set yes also on OpenSolaris.

lib/rinda/tuplespace.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,6 @@ def initialize(period=60)
404404

405405
def write(tuple, sec=nil)
406406
entry = TupleEntry.new(tuple, sec)
407-
start_keeper
408407
synchronize do
409408
if entry.expired?
410409
@read_waiter.find_all_template(entry).each do |template|
@@ -414,6 +413,7 @@ def write(tuple, sec=nil)
414413
notify_event('delete', entry.value)
415414
else
416415
@bag.push(entry)
416+
start_keeper if entry.expires
417417
@read_waiter.find_all_template(entry).each do |template|
418418
template.read(tuple)
419419
end
@@ -439,7 +439,6 @@ def take(tuple, sec=nil, &block)
439439
def move(port, tuple, sec=nil)
440440
template = WaitTemplateEntry.new(self, tuple, sec)
441441
yield(template) if block_given?
442-
start_keeper
443442
synchronize do
444443
entry = @bag.find(template)
445444
if entry
@@ -452,6 +451,7 @@ def move(port, tuple, sec=nil)
452451

453452
begin
454453
@take_waiter.push(template)
454+
start_keeper if template.expires
455455
while true
456456
raise RequestCanceledError if template.canceled?
457457
raise RequestExpiredError if template.expired?
@@ -476,14 +476,14 @@ def move(port, tuple, sec=nil)
476476
def read(tuple, sec=nil)
477477
template = WaitTemplateEntry.new(self, tuple, sec)
478478
yield(template) if block_given?
479-
start_keeper
480479
synchronize do
481480
entry = @bag.find(template)
482481
return entry.value if entry
483482
raise RequestExpiredError if template.expired?
484483

485484
begin
486485
@read_waiter.push(template)
486+
start_keeper if template.expires
487487
template.wait
488488
raise RequestCanceledError if template.canceled?
489489
raise RequestExpiredError if template.expired?
@@ -566,8 +566,11 @@ def notify_event(event, tuple)
566566
def start_keeper
567567
return if @keeper && @keeper.alive?
568568
@keeper = Thread.new do
569-
while need_keeper?
570-
keep_clean
569+
while true
570+
synchronize do
571+
break unless need_keeper?
572+
keep_clean
573+
end
571574
sleep(@period)
572575
end
573576
end

test/rinda/test_rinda.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,20 @@ def test_inp_rdp
240240
end
241241
end
242242

243+
def test_ruby_talk_264062
244+
th = Thread.new { @ts.take([:empty], 1) }
245+
sleep 2
246+
assert_raises(Rinda::RequestExpiredError) do
247+
th.value
248+
end
249+
250+
th = Thread.new { @ts.read([:empty], 1) }
251+
sleep 2
252+
assert_raises(Rinda::RequestExpiredError) do
253+
th.value
254+
end
255+
end
256+
243257
def test_core_01
244258
5.times do |n|
245259
@ts.write([:req, 2])

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define RUBY_RELEASE_DATE "2007-08-22"
33
#define RUBY_VERSION_CODE 186
44
#define RUBY_RELEASE_CODE 20070822
5-
#define RUBY_PATCHLEVEL 87
5+
#define RUBY_PATCHLEVEL 88
66

77
#define RUBY_VERSION_MAJOR 1
88
#define RUBY_VERSION_MINOR 8

0 commit comments

Comments
 (0)