Sha256: 90d756e80cb5be0f861bf8e842221fa0cbf1a21569d7c9f85788cdc48b933310
Contents?: true
Size: 1.37 KB
Versions: 5
Compression:
Stored size: 1.37 KB
Contents
module Tins module ThreadLocal @@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 # Define a thread local variable named _name_ in this module/class. If the # value _value_ is given, it is used to initialize the variable. 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 # 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. def instance_thread_local(name, value = nil) sc = class << self extend Tins::ThreadLocal self end sc.thread_local name, value self end end end
Version data entries
5 entries across 5 versions & 1 rubygems
Version | Path |
---|---|
tins-1.3.0 | lib/tins/thread_local.rb |
tins-1.2.0 | lib/tins/thread_local.rb |
tins-1.1.0 | lib/tins/thread_local.rb |
tins-1.0.1 | lib/tins/thread_local.rb |
tins-1.0.0 | lib/tins/thread_local.rb |