module Tins::ThreadGlobal

Public Instance Methods

instance_thread_global(name, value = nil) click to toggle source

Define a thread global variable for the current instance with name name. If the value value is given, it is used to initialize the variable.

# File lib/tins/dslkit.rb, line 79
def instance_thread_global(name, value = nil)
  sc = class << self
    extend Tins::ThreadGlobal
    self
  end
  sc.thread_global name, value
  self
end
thread_global(name, default_value = nil) click to toggle source

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

# File lib/tins/dslkit.rb, line 55
def thread_global(name, default_value = nil)
  is_a?(Module) or raise TypeError, "receiver has to be a Module"

  name = name.to_s
  var_name = "@__#{name}_#{__id__.abs}__"

  lock = Mutex.new
  modul = self

  define_method(name) do
    lock.synchronize { modul.instance_variable_get var_name }
  end

  define_method(name + "=") do |value|
    lock.synchronize { modul.instance_variable_set var_name, value }
  end

  modul.instance_variable_set var_name, default_value if default_value
  self
end