Skip to content

Commit 1ceb7bc

Browse files
committed
Merge pull request #467 from ruby-concurrency/synchronization
Rename attr_volatile_with_cas to attr_atomic
2 parents d8ff4a9 + 5f0d137 commit 1ceb7bc

File tree

10 files changed

+43
-29
lines changed

10 files changed

+43
-29
lines changed

lib/concurrent/atom.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class Atom < Synchronization::Object
9595
include Concern::Observable
9696

9797
safe_initialization!
98-
private(*attr_volatile_with_cas(:value))
98+
private(*attr_atomic(:value))
9999
public :value
100100

101101
# Create a new atom with the given initial value.

lib/concurrent/atomics.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# @!macro [new] atomic_reference
22
#
3-
# An object reference that may be updated atomically.
3+
# An object reference that may be updated atomically. All read and write
4+
# operations have java volatile semantic.
45
#
56
# @!macro thread_safe_variable_comparison
67
#

lib/concurrent/channel.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require 'forwardable'
2+
13
require 'concurrent/channel/buffer'
24
require 'concurrent/channel/selector'
35

lib/concurrent/edge/atomic_markable_reference.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ module Edge
1111
# @api Edge
1212
class AtomicMarkableReference < ::Concurrent::Synchronization::Object
1313

14-
private(*attr_volatile_with_cas(:reference))
14+
private(*attr_atomic(:reference))
1515

1616
# @!macro [attach] atomic_markable_reference_method_initialize
1717
def initialize(value = nil, mark = false)

lib/concurrent/edge/future.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def post_on(executor, *args, &job)
131131
# Represents an event which will happen in future (will be completed). It has to always happen.
132132
class Event < Synchronization::LockableObject
133133
safe_initialization!
134-
private(*attr_volatile_with_cas(:internal_state))
134+
private(*attr_atomic(:internal_state))
135135
public :internal_state
136136
include Concern::Deprecation
137137
include Concern::Logging
@@ -176,13 +176,13 @@ def to_sym
176176

177177
def initialize(promise, default_executor)
178178
super()
179-
@Promise = promise
180-
@DefaultExecutor = default_executor
181-
@Touched = AtomicBoolean.new(false)
182-
@Callbacks = LockFreeStack.new
179+
@Promise = promise
180+
@DefaultExecutor = default_executor
181+
@Touched = AtomicBoolean.new(false)
182+
@Callbacks = LockFreeStack.new
183183
# TODO (pitr 12-Sep-2015): replace with AtomicFixnum, avoid aba problem
184184
# TODO (pitr 12-Sep-2015): look at java.util.concurrent solution
185-
@Waiters = LockFreeStack.new
185+
@Waiters = LockFreeStack.new
186186
self.internal_state = PENDING
187187
end
188188

lib/concurrent/edge/lock_free_stack.rb

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def next_node
2323

2424
EMPTY = Empty[nil, nil]
2525

26-
private(*attr_volatile_with_cas(:head))
26+
private(*attr_atomic(:head))
2727

2828
def initialize
2929
super()
@@ -64,6 +64,18 @@ def compare_and_clear(head)
6464
compare_and_set_head head, EMPTY
6565
end
6666

67+
include Enumerable
68+
69+
def each(head = nil)
70+
return to_enum(:each, head) unless block_given?
71+
it = head || peek
72+
until it.equal?(EMPTY)
73+
yield it.value
74+
it = it.next_node
75+
end
76+
self
77+
end
78+
6779
def clear
6880
while true
6981
current_head = head
@@ -72,16 +84,15 @@ def clear
7284
end
7385
end
7486

75-
include Enumerable
76-
77-
def each
78-
return to_enum unless block_given?
79-
it = peek
80-
until it.equal?(EMPTY)
81-
yield it.value
82-
it = it.next_node
87+
def clear_each(&block)
88+
while true
89+
current_head = head
90+
return self if current_head == EMPTY
91+
if compare_and_set_head current_head, EMPTY
92+
each current_head, &block
93+
return self
94+
end
8395
end
84-
self
8596
end
8697

8798
end

lib/concurrent/exchanger.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class RubyExchanger < AbstractExchanger
143143
safe_initialization!
144144

145145
class Node < Concurrent::Synchronization::Object
146-
attr_volatile_with_cas :value
146+
attr_atomic :value
147147
safe_initialization!
148148

149149
def initialize(item)
@@ -170,7 +170,7 @@ def initialize
170170

171171
private
172172

173-
attr_volatile_with_cas(:slot)
173+
attr_atomic(:slot)
174174

175175
# @!macro exchanger_method_do_exchange
176176
#

lib/concurrent/lazy_register.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ module Concurrent
1818
# @!macro edge_warning
1919
class LazyRegister < Synchronization::Object
2020

21-
private(*attr_volatile_with_cas(:data))
21+
private(*attr_atomic(:data))
2222

2323
def initialize
2424
super

lib/concurrent/synchronization/object.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ module Synchronization
1818
# Abstract object providing final, volatile, ans CAS extensions to build other concurrent abstractions.
1919
# - final instance variables see {Object.safe_initialization!}
2020
# - volatile instance variables see {Object.attr_volatile}
21-
# - volatile instance variables see {Object.attr_volatile_with_cas}
21+
# - volatile instance variables see {Object.attr_atomic}
2222
class Object < ObjectImplementation
2323

2424
# @!method self.attr_volatile(*names)
@@ -87,14 +87,14 @@ def self.new(*)
8787
# `compare_and_set_value(expected, value) #=> true || false`, `update_value(&block)`.
8888
# @param [Array<Symbol>] names of the instance variables to be volatile with CAS.
8989
# @return [Array<Symbol>] names of defined method names.
90-
def self.attr_volatile_with_cas(*names)
90+
def self.attr_atomic(*names)
9191
@volatile_cas_fields ||= []
9292
@volatile_cas_fields += names
9393
safe_initialization!
9494
define_initialize_volatile_with_cas
9595

9696
names.each do |name|
97-
ivar = :"@VolatileCas#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }}"
97+
ivar = :"@Atomic#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }}"
9898
class_eval <<-RUBY, __FILE__, __LINE__ + 1
9999
def #{name}
100100
#{ivar}.get
@@ -131,7 +131,7 @@ def self.volatile_cas_fields(inherited = true)
131131
private
132132

133133
def self.define_initialize_volatile_with_cas
134-
assignments = @volatile_cas_fields.map { |name| "@VolatileCas#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }} = AtomicReference.new(nil)" }.join("\n")
134+
assignments = @volatile_cas_fields.map { |name| "@Atomic#{name.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }} = AtomicReference.new(nil)" }.join("\n")
135135
class_eval <<-RUBY
136136
def initialize_volatile_with_cas
137137
super

spec/concurrent/synchronization_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,10 @@ class BareClass
196196
it_should_behave_like :attr_volatile
197197
end
198198

199-
describe 'attr_volatile_with_cas' do
199+
describe 'attr_atomic' do
200200
specify do
201201
a = Class.new(Synchronization::Object) do
202-
attr_volatile_with_cas :a
202+
attr_atomic :a
203203

204204
def initialize(*rest)
205205
super
@@ -208,7 +208,7 @@ def initialize(*rest)
208208
end
209209

210210
b = Class.new(a) do
211-
attr_volatile_with_cas :b
211+
attr_atomic :b
212212

213213
def initialize
214214
super

0 commit comments

Comments
 (0)