62
63
64
65
66
67
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
98
99
100
101
102
103
|
# File 'lib/thread_attr_accessor.rb', line 62
def thread_attr_reader(*names, default: nil, inherit: false, private: false, **opts)
if default && inherit
get_default = ->(thread_key) {
ThreadAttrAccessor.search_in_ancestor_threads(thread_key) ||
default.call
}
elsif inherit
get_default = ThreadAttrAccessor.method(:search_in_ancestor_threads)
elsif default
get_default = ->(*) { default.call }
end
if get_default
get_value = ->(thread_key) {
if value = Thread.current.thread_variable_get(thread_key)
value
else
default_value = get_default.call(thread_key)
Thread.current.thread_variable_set(thread_key, default_value)
default_value
end
}
else
get_value = ->(thread_key) {
Thread.current.thread_variable_get(thread_key)
}
end
mod = const_get(:ThreadAttributeAccessors)
names.each do |name|
thread_key = ThreadAttrAccessor.thread_accessor_key(self, name)
mod.send(:define_method, name) do
get_value.call(thread_key)
end
if private
mod.send :private, name
end
end
end
|