From c20b07d5357d7cb73226b149431a658cde54a697 Mon Sep 17 00:00:00 2001 From: nagachika Date: Thu, 11 Aug 2016 18:30:09 +0000 Subject: merge revision(s) 55008: [Backport #12342] * lib/drb/timeridconv.rb: don't use keeper thread. [Bug #12342] * test/drb/ut_timerholder.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@55867 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/drb/timeridconv.rb | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) (limited to 'lib') diff --git a/lib/drb/timeridconv.rb b/lib/drb/timeridconv.rb index e83eb72765..7e2a6cf998 100644 --- a/lib/drb/timeridconv.rb +++ b/lib/drb/timeridconv.rb @@ -18,26 +18,27 @@ module DRb class InvalidIndexError < RuntimeError; end - def initialize(timeout=600) + def initialize(keeping=600) super() @sentinel = Object.new @gc = {} - @curr = {} @renew = {} - @timeout = timeout - @keeper = keeper + @keeping = keeping + @expires = Time.now + @keeping end def add(obj) synchronize do + rotate key = obj.__id__ - @curr[key] = obj + @renew[key] = obj return key end end def fetch(key, dv=@sentinel) synchronize do + rotate obj = peek(key) if obj == @sentinel return dv unless dv == @sentinel @@ -48,42 +49,35 @@ module DRb end end - def include?(key) - synchronize do - obj = peek(key) - return false if obj == @sentinel - true - end - end - + private def peek(key) synchronize do - return @curr.fetch(key, @renew.fetch(key, @gc.fetch(key, @sentinel))) + return @renew.fetch(key) { @gc.fetch(key, @sentinel) } end end - private - def alternate + def rotate synchronize do - @gc = @curr # GCed - @curr = @renew + return if @expires > Time.now + @gc = @renew # GCed @renew = {} + @expires = Time.now + @keeping end end def keeper Thread.new do loop do - alternate - sleep(@timeout) + rotate + sleep(@keeping) end end end end - # Creates a new TimerIdConv which will hold objects for +timeout+ seconds. - def initialize(timeout=600) - @holder = TimerHolder2.new(timeout) + # Creates a new TimerIdConv which will hold objects for +keeping+ seconds. + def initialize(keeping=600) + @holder = TimerHolder2.new(keeping) end def to_obj(ref) # :nodoc: -- cgit v1.2.3