~ubuntu-branches/ubuntu/quantal/ruby1.9.1/quantal

« back to all changes in this revision

Viewing changes to lib/drb/timeridconv.rb

  • Committer: Bazaar Package Importer
  • Author(s): Lucas Nussbaum
  • Date: 2011-09-24 19:16:17 UTC
  • mfrom: (1.1.8 upstream) (13.1.7 experimental)
  • Revision ID: james.westby@ubuntu.com-20110924191617-o1qz4rcmqjot8zuy
Tags: 1.9.3~rc1-1
* New upstream release: 1.9.3 RC1.
  + Includes load.c fixes. Closes: #639959.
* Upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
      class InvalidIndexError < RuntimeError; end
10
10
 
11
11
      def initialize(timeout=600)
12
 
        super()
13
 
        @sentinel = Object.new
14
 
        @gc = {}
15
 
        @curr = {}
16
 
        @renew = {}
17
 
        @timeout = timeout
18
 
        @keeper = keeper
 
12
        super()
 
13
        @sentinel = Object.new
 
14
        @gc = {}
 
15
        @curr = {}
 
16
        @renew = {}
 
17
        @timeout = timeout
 
18
        @keeper = keeper
19
19
      end
20
20
 
21
21
      def add(obj)
22
 
        synchronize do
23
 
          key = obj.__id__
24
 
          @curr[key] = obj
25
 
          return key
26
 
        end
 
22
        synchronize do
 
23
          key = obj.__id__
 
24
          @curr[key] = obj
 
25
          return key
 
26
        end
27
27
      end
28
28
 
29
29
      def fetch(key, dv=@sentinel)
30
 
        synchronize do
31
 
          obj = peek(key)
32
 
          if obj == @sentinel
33
 
            return dv unless dv == @sentinel
34
 
            raise InvalidIndexError
35
 
          end
36
 
          @renew[key] = obj # KeepIt
37
 
          return obj
38
 
        end
 
30
        synchronize do
 
31
          obj = peek(key)
 
32
          if obj == @sentinel
 
33
            return dv unless dv == @sentinel
 
34
            raise InvalidIndexError
 
35
          end
 
36
          @renew[key] = obj # KeepIt
 
37
          return obj
 
38
        end
39
39
      end
40
40
 
41
41
      def include?(key)
42
 
        synchronize do
43
 
          obj = peek(key)
44
 
          return false if obj == @sentinel
45
 
          true
46
 
        end
 
42
        synchronize do
 
43
          obj = peek(key)
 
44
          return false if obj == @sentinel
 
45
          true
 
46
        end
47
47
      end
48
48
 
49
49
      def peek(key)
50
 
        synchronize do
51
 
          return @curr.fetch(key, @renew.fetch(key, @gc.fetch(key, @sentinel)))
52
 
        end
 
50
        synchronize do
 
51
          return @curr.fetch(key, @renew.fetch(key, @gc.fetch(key, @sentinel)))
 
52
        end
53
53
      end
54
54
 
55
55
      private
56
56
      def alternate
57
 
        synchronize do
58
 
          @gc = @curr       # GCed
59
 
          @curr = @renew
60
 
          @renew = {}
61
 
        end
 
57
        synchronize do
 
58
          @gc = @curr       # GCed
 
59
          @curr = @renew
 
60
          @renew = {}
 
61
        end
62
62
      end
63
63
 
64
64
      def keeper
65
 
        Thread.new do
66
 
          loop do
67
 
            size = alternate
68
 
            sleep(@timeout)
69
 
          end
70
 
        end
 
65
        Thread.new do
 
66
          loop do
 
67
            alternate
 
68
            sleep(@timeout)
 
69
          end
 
70
        end
71
71
      end
72
72
    end
73
73