@@ -11,11 +11,11 @@ module Edge
1111 # @api Edge
1212 class AtomicMarkableReference < ::Concurrent ::Synchronization ::Object
1313
14+ private *attr_volatile_with_cas ( :reference )
15+
1416 # @!macro [attach] atomic_markable_reference_method_initialize
1517 def initialize ( value = nil , mark = false )
16- super ( )
17- @Reference = AtomicReference . new ImmutableArray [ value , mark ]
18- ensure_ivar_visibility!
18+ super ( ImmutableArray [ value , mark ] ) # ensures visibility
1919 end
2020
2121 # @!macro [attach] atomic_markable_reference_method_compare_and_set
@@ -36,7 +36,7 @@ def initialize(value = nil, mark = false)
3636 def compare_and_set ( expected_val , new_val , expected_mark , new_mark )
3737 # Memoize a valid reference to the current AtomicReference for
3838 # later comparison.
39- current = @Reference . get
39+ current = reference
4040 curr_val , curr_mark = current
4141
4242 # Ensure that that the expected marks match.
@@ -56,7 +56,7 @@ def compare_and_set(expected_val, new_val, expected_mark, new_mark)
5656
5757 prospect = ImmutableArray [ new_val , new_mark ]
5858
59- @Reference . compare_and_set current , prospect
59+ compare_and_set_reference current , prospect
6060 end
6161 alias_method :compare_and_swap , :compare_and_set
6262
@@ -66,7 +66,7 @@ def compare_and_set(expected_val, new_val, expected_mark, new_mark)
6666 #
6767 # @return [ImmutableArray] the current reference and marked values
6868 def get
69- @Reference . get
69+ reference
7070 end
7171
7272 # @!macro [attach] atomic_markable_reference_method_value
@@ -75,7 +75,7 @@ def get
7575 #
7676 # @return [Object] the current value of the reference
7777 def value
78- @Reference . get [ 0 ]
78+ reference [ 0 ]
7979 end
8080
8181 # @!macro [attach] atomic_markable_reference_method_mark
@@ -84,7 +84,7 @@ def value
8484 #
8585 # @return [Boolean] the current marked value
8686 def mark
87- @Reference . get [ 1 ]
87+ reference [ 1 ]
8888 end
8989 alias_method :marked? , :mark
9090
@@ -98,7 +98,7 @@ def mark
9898 #
9999 # @return [ImmutableArray] both the new value and the new mark
100100 def set ( new_val , new_mark )
101- @Reference . set ImmutableArray [ new_val , new_mark ]
101+ self . reference = ImmutableArray [ new_val , new_mark ]
102102 end
103103
104104 # @!macro [attach] atomic_markable_reference_method_update
@@ -115,7 +115,7 @@ def set(new_val, new_mark)
115115 # @return [ImmutableArray] the new value and new mark
116116 def update
117117 loop do
118- old_val , old_mark = @Reference . get
118+ old_val , old_mark = reference
119119 new_val , new_mark = yield old_val , old_mark
120120
121121 if compare_and_set old_val , new_val , old_mark , new_mark
@@ -139,7 +139,7 @@ def update
139139 #
140140 # @raise [Concurrent::ConcurrentUpdateError] if the update fails
141141 def try_update!
142- old_val , old_mark = @Reference . get
142+ old_val , old_mark = reference
143143 new_val , new_mark = yield old_val , old_mark
144144
145145 unless compare_and_set old_val , new_val , old_mark , new_mark
@@ -165,7 +165,7 @@ def try_update!
165165 # @return [ImmutableArray] the new value and marked state, or nil if
166166 # the update failed
167167 def try_update
168- old_val , old_mark = @Reference . get
168+ old_val , old_mark = reference
169169 new_val , new_mark = yield old_val , old_mark
170170
171171 return unless compare_and_set old_val , new_val , old_mark , new_mark
0 commit comments