Class: Concurrent::FiberLocalVar
- Inherits:
-
Object
- Object
- Concurrent::FiberLocalVar
- Defined in:
- lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb
Overview
A FiberLocalVar
is a variable where the value is different for each fiber.
Each variable may have a default value, but when you modify the variable only
the current fiber will ever see that change.
This is similar to Ruby's built-in fiber-local variables (Thread.current[:name]
),
but with these major advantages:
FiberLocalVar
has its own identity, it doesn't need a Symbol.- Each Ruby's built-in fiber-local variable leaks some memory forever (it's a Symbol held forever on the fiber),
so it's only OK to create a small amount of them.
FiberLocalVar
has no such issue and it is fine to create many of them. - Ruby's built-in fiber-local variables leak forever the value set on each fiber (unless set to nil explicitly).
FiberLocalVar
automatically removes the mapping for each fiber once theFiberLocalVar
instance is GC'd.
Constant Summary collapse
- LOCALS =
FiberLocals.new
Instance Method Summary collapse
-
#bind(value) { ... } ⇒ Object
Bind the given value to fiber local storage during execution of the given block.
-
#initialize(default = nil, &default_block) ⇒ FiberLocalVar
constructor
Creates a fiber local variable.
-
#value ⇒ Object
Returns the value in the current fiber's copy of this fiber-local variable.
-
#value=(value) ⇒ Object
Sets the current fiber's copy of this fiber-local variable to the specified value.
Constructor Details
#initialize(default = nil, &default_block) ⇒ FiberLocalVar
Creates a fiber local variable.
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb', line 49 def initialize(default = nil, &default_block) if default && block_given? raise ArgumentError, "Cannot use both value and block as default value" end if block_given? @default_block = default_block @default = nil else @default_block = nil @default = default end @index = LOCALS.next_index(self) end |
Instance Method Details
#bind(value) { ... } ⇒ Object
Bind the given value to fiber local storage during execution of the given block.
86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb', line 86 def bind(value) if block_given? old_value = self.value self.value = value begin yield ensure self.value = old_value end end end |
#value ⇒ Object
Returns the value in the current fiber's copy of this fiber-local variable.
68 69 70 |
# File 'lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb', line 68 def value LOCALS.fetch(@index) { default } end |
#value=(value) ⇒ Object
Sets the current fiber's copy of this fiber-local variable to the specified value.
76 77 78 |
# File 'lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb', line 76 def value=(value) LOCALS.set(@index, value) end |