Module: ASIR::ThreadVariable::ModuleMethods

Defined in:
lib/asir/thread_variable.rb

Instance Method Summary collapse

Instance Method Details

#attr_accessor_thread(*names) ⇒ Object

TODO: clear instance thread variables when instance is GCed.



101
102
103
104
# File 'lib/asir/thread_variable.rb', line 101

def attr_accessor_thread *names
  attr_getter_thread *names
  attr_setter_thread *names
end

#attr_getter_thread(*names) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/asir/thread_variable.rb', line 129

def attr_getter_thread *names
  opts = Hash === names[-1] ? names.pop : EMPTY_HASH

  expr = [ <<"END", __FILE__, __LINE__ ]
def self.attr_thread_hash(obj)
  thr = Thread.current
  ObjectSpace.define_finalizer(obj) do | oid |
(thr[:'#{self.name}\#'] ||= { }).delete(oid)
  end
  { }
end

def thread_attrs
  (Thread.current[:'#{self.name}\#'] ||= { })[self.object_id] ||= #{self.name}.attr_thread_hash(self)
end

def attr_thread_clear_all! oid = self.object_id
  (Thread.current[:'#{self.name}\#'] ||= { }).delete(oid)
end
END
  $stderr.puts "expr::\n#{expr}\n====" if opts[:debug] || DEBUG
  class_eval *expr

  initialize = opts[:initialize]
  if initialize
    initialize = "||= { }"
  end

  default = opts[:default]
  default = "__val ||= [ #{default} ]" if default

  transform = opts[:transform]
  transform = "__val = (#{transform})" if transform

  names.each do | name |
    expr = [ <<"END", __FILE__, __LINE__ ]
def #{name}
  __val = (thread_attrs[:'#{name}'] #{initialize})
  #{default}
  __val &&= __val.first
  #{transform}
  __val
end
END
    $stderr.puts "expr::\n#{expr}\n====" if opts[:debug] || DEBUG
    class_eval *expr
  end
end

#attr_setter_thread(*names) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/asir/thread_variable.rb', line 106

def attr_setter_thread *names
  opts = Hash === names[-1] ? names.pop : EMPTY_HASH

  transform = opts[:setter_transform]
  transform = "__val = (#{transform})" if transform

  names.each do | name |
    expr = [ <<"END", __FILE__, __LINE__ ]
def clear_#{name}
  ((Thread.current[:'#{self.name}\#'] ||= { })[self.object_id] || { }).delete(:'#{name}')
  self
end

def #{name}= __val
  #{transform}
  thread_attrs[:'#{name}'] = [ __val ]
end
END
    $stderr.puts "expr::\n#{expr}\n====" if opts[:debug] || DEBUG
    class_eval *expr
  end
end

#mattr_accessor_thread(*names) ⇒ Object Also known as: cattr_accessor_thread

Defines a Module or Class attribute stored in Thread.current.



34
35
36
37
# File 'lib/asir/thread_variable.rb', line 34

def mattr_accessor_thread *names
  mattr_getter_thread *names
  mattr_setter_thread *names
end

#mattr_getter_thread(*names) ⇒ Object Also known as: cattr_getter_thread

Defines a class attribute getter stored in Thread.current.

Options:

:initialize -- String: expression to initialize the variable is undefined.
:default    -- String: expression to return if the variable value if undefined.
:transform  -- String: expression to transform the __val variable before returning.

Also defines clear_NAME method that undefines the thread variable.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/asir/thread_variable.rb', line 68

def mattr_getter_thread *names
  opts = Hash === names[-1] ? names.pop : EMPTY_HASH

  initialize = opts[:initialize]
  initialize = "||= [ #{initialize} ]" if initialize

  default = opts[:default]
  default = "__val ||= [ #{default} ]" if default

  transform = opts[:transform]
  transform = "__val = (#{transform})" if transform

  names.each do | name |
    instance_eval(expr = <<"END", __FILE__, __LINE__)
def self.clear_#{name}
  Thread.current[:'#{self.name}.#{name}'] = nil
  self
end

def self.#{name}
  __val = Thread.current[:'#{self.name}.#{name}'] #{initialize}
  #{default}
  __val &&= __val.first
  #{transform}
  __val
end
END
    # $stderr.puts "#{expr}"
  end
end

#mattr_setter_thread(*names) ⇒ Object Also known as: cattr_setter_thread

Defines a Module or Class attribute setter stored in Thread.current.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/asir/thread_variable.rb', line 41

def mattr_setter_thread *names
  opts = Hash === names[-1] ? names.pop : EMPTY_HASH

  transform = opts[:setter_transform]
  transform = "__val = (#{transform})" if transform

  names.each do | name |
    instance_eval(expr = <<"END", __FILE__, __LINE__)
def self.#{name}= __val
  #{transform}
  Thread.current[:'#{self.name}.#{name}'] = [ __val ]
end
END
    # $stderr.puts "#{expr}"
  end
end