Method: Tins::ThreadLocal#thread_local

Defined in:
lib/tins/thread_local.rb

#thread_local(name, default_value = nil) ⇒ Object

Define a thread local variable named name in this module/class. If the value value is given, it is used to initialize the variable.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/tins/thread_local.rb', line 16

def thread_local(name, default_value = nil)
  is_a?(Module) or raise TypeError, "receiver has to be a Module"

  name = name.to_s
  my_id = "__thread_local_#{__id__}__"

  ObjectSpace.define_finalizer(self, @@cleanup)

  define_method(name) do
    Thread.current[my_id] ||= {}
    Thread.current[my_id][name]
  end

  define_method("#{name}=") do |value|
    Thread.current[my_id] ||= {}
    Thread.current[my_id][name] = value
  end

  if default_value
    Thread.current[my_id] = {}
    Thread.current[my_id][name] = default_value
  end
  self
end