Module: Tins::ThreadLocal
Constant Summary collapse
- @@mutex =
Mutex.new
- @@cleanup =
lambda do |my_object_id| my_id = "__thread_local_#{my_object_id}__" @@mutex.synchronize do for t in Thread.list t[my_id] = nil if t[my_id] end end end
Instance Method Summary collapse
-
#instance_thread_local(name, value = nil) ⇒ Object
Define a thread local variable for the current instance with name name.
-
#thread_local(name, default_value = nil) ⇒ Object
Define a thread local variable named name in this module/class.
Instance Method Details
#instance_thread_local(name, value = nil) ⇒ Object
Define a thread local variable for the current instance with name name. If the value value is given, it is used to initialize the variable.
43 44 45 46 47 48 49 |
# File 'lib/tins/thread_local.rb', line 43 def instance_thread_local(name, value = nil) class << self extend Tins::ThreadLocal self end.thread_local name, value self end |
#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 |