diff options
author | seki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-05-22 11:03:43 +0000 |
---|---|---|
committer | seki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-05-22 11:03:43 +0000 |
commit | 021e8ead5c4296792db030e62ab4190c9d6617be (patch) | |
tree | b4ec215428c353b712aa7f8cf5020d38da30f6f7 /lib/drb | |
parent | 0bf2e5c70bd153db6dd0d49552ad4db1a18a6097 (diff) | |
download | ruby-021e8ead5c4296792db030e62ab4190c9d6617be.tar.gz |
use finalizer trick instead of thread.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55118 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/drb')
-rw-r--r-- | lib/drb/timeridconv.rb | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/lib/drb/timeridconv.rb b/lib/drb/timeridconv.rb index 7e2a6cf998..0f45f4a08e 100644 --- a/lib/drb/timeridconv.rb +++ b/lib/drb/timeridconv.rb @@ -24,7 +24,7 @@ module DRb @gc = {} @renew = {} @keeping = keeping - @expires = Time.now + @keeping + @expires = nil end def add(obj) @@ -32,18 +32,16 @@ module DRb rotate key = obj.__id__ @renew[key] = obj + invoke_keeper return key end end - def fetch(key, dv=@sentinel) + def fetch(key) synchronize do rotate obj = peek(key) - if obj == @sentinel - return dv unless dv == @sentinel - raise InvalidIndexError - end + raise InvalidIndexError if obj == @sentinel @renew[key] = obj # KeepIt return obj end @@ -51,25 +49,28 @@ module DRb private def peek(key) - synchronize do - return @renew.fetch(key) { @gc.fetch(key, @sentinel) } - end + return @renew.fetch(key) { @gc.fetch(key, @sentinel) } end - def rotate - synchronize do - return if @expires > Time.now - @gc = @renew # GCed - @renew = {} - @expires = Time.now + @keeping - end + def invoke_keeper + return if @expires + @expires = Time.now + @keeping + on_gc + end + + def on_gc + return unless Thread.main.alive? + return if @expires.nil? + Thread.new { rotate } if @expires < Time.now + ObjectSpace.define_finalizer(Object.new) {on_gc} end - def keeper - Thread.new do - loop do - rotate - sleep(@keeping) + def rotate + synchronize do + if @expires &.< Time.now + @gc = @renew # GCed + @renew = {} + @expires = @gc.empty? ? nil : Time.now + @keeping end end end |