Class: Google::Protobuf::Internal::ObjectCache
- Inherits:
-
Object
- Object
- Google::Protobuf::Internal::ObjectCache
- Defined in:
- lib/google/protobuf/internal/object_cache.rb
Overview
A pointer -> Ruby Object cache that keeps references to Ruby wrapper objects. This allows us to look up any Ruby wrapper object by the address of the object it is wrapping. That way we can avoid ever creating two different wrapper objects for the same C object, which saves memory and preserves object identity.
We use WeakMap for the cache. If sizeof(long) > sizeof(VALUE), we also need a secondary Hash to store WeakMap keys, because our pointer keys may need to be stored as Bignum instead of Fixnum. Since WeakMap is weak for both keys and values, a Bignum key will cause the WeakMap entry to be collected immediately unless there is another reference to the Bignum. This happens on 64-bit Windows, on which pointers are 64 bits but longs are 32 bits. In this case, we enable the secondary Hash to hold the keys and prevent them from being collected.
Instance Method Summary collapse
- #get(key) ⇒ Object
-
#initialize ⇒ ObjectCache
constructor
A new instance of ObjectCache.
- #try_add(key, value) ⇒ Object
Constructor Details
#initialize ⇒ ObjectCache
Returns a new instance of ObjectCache.
26 27 28 29 |
# File 'lib/google/protobuf/internal/object_cache.rb', line 26 def initialize @map = ObjectSpace::WeakMap.new @mutex = Mutex.new end |
Instance Method Details
#get(key) ⇒ Object
31 32 33 |
# File 'lib/google/protobuf/internal/object_cache.rb', line 31 def get(key) @map[key] end |
#try_add(key, value) ⇒ Object
35 36 37 38 39 |
# File 'lib/google/protobuf/internal/object_cache.rb', line 35 def try_add(key, value) @map[key] || @mutex.synchronize do @map[key] ||= value end end |