Module: ASIR::ThreadVariable::ModuleMethods
- Defined in:
- lib/asir/thread_variable.rb
Instance Method Summary collapse
-
#attr_accessor_thread(*names) ⇒ Object
TODO: clear instance thread variables when instance is GCed.
- #attr_getter_thread(*names) ⇒ Object
- #attr_setter_thread(*names) ⇒ Object
-
#mattr_accessor_thread(*names) ⇒ Object
(also: #cattr_accessor_thread)
Defines a Module or Class attribute stored in Thread.current.
-
#mattr_getter_thread(*names) ⇒ Object
(also: #cattr_getter_thread)
Defines a class attribute getter stored in Thread.current.
-
#mattr_setter_thread(*names) ⇒ Object
(also: #cattr_setter_thread)
Defines a Module or Class attribute setter stored in Thread.current.
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 |