@@ -11,11 +11,11 @@ module Edge
11
11
# @api Edge
12
12
class AtomicMarkableReference < ::Concurrent ::Synchronization ::Object
13
13
14
+ private *attr_volatile_with_cas ( :reference )
15
+
14
16
# @!macro [attach] atomic_markable_reference_method_initialize
15
17
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
19
19
end
20
20
21
21
# @!macro [attach] atomic_markable_reference_method_compare_and_set
@@ -36,7 +36,7 @@ def initialize(value = nil, mark = false)
36
36
def compare_and_set ( expected_val , new_val , expected_mark , new_mark )
37
37
# Memoize a valid reference to the current AtomicReference for
38
38
# later comparison.
39
- current = @Reference . get
39
+ current = reference
40
40
curr_val , curr_mark = current
41
41
42
42
# Ensure that that the expected marks match.
@@ -56,7 +56,7 @@ def compare_and_set(expected_val, new_val, expected_mark, new_mark)
56
56
57
57
prospect = ImmutableArray [ new_val , new_mark ]
58
58
59
- @Reference . compare_and_set current , prospect
59
+ compare_and_set_reference current , prospect
60
60
end
61
61
alias_method :compare_and_swap , :compare_and_set
62
62
@@ -66,7 +66,7 @@ def compare_and_set(expected_val, new_val, expected_mark, new_mark)
66
66
#
67
67
# @return [ImmutableArray] the current reference and marked values
68
68
def get
69
- @Reference . get
69
+ reference
70
70
end
71
71
72
72
# @!macro [attach] atomic_markable_reference_method_value
@@ -75,7 +75,7 @@ def get
75
75
#
76
76
# @return [Object] the current value of the reference
77
77
def value
78
- @Reference . get [ 0 ]
78
+ reference [ 0 ]
79
79
end
80
80
81
81
# @!macro [attach] atomic_markable_reference_method_mark
@@ -84,7 +84,7 @@ def value
84
84
#
85
85
# @return [Boolean] the current marked value
86
86
def mark
87
- @Reference . get [ 1 ]
87
+ reference [ 1 ]
88
88
end
89
89
alias_method :marked? , :mark
90
90
@@ -98,7 +98,7 @@ def mark
98
98
#
99
99
# @return [ImmutableArray] both the new value and the new mark
100
100
def set ( new_val , new_mark )
101
- @Reference . set ImmutableArray [ new_val , new_mark ]
101
+ self . reference = ImmutableArray [ new_val , new_mark ]
102
102
end
103
103
104
104
# @!macro [attach] atomic_markable_reference_method_update
@@ -115,7 +115,7 @@ def set(new_val, new_mark)
115
115
# @return [ImmutableArray] the new value and new mark
116
116
def update
117
117
loop do
118
- old_val , old_mark = @Reference . get
118
+ old_val , old_mark = reference
119
119
new_val , new_mark = yield old_val , old_mark
120
120
121
121
if compare_and_set old_val , new_val , old_mark , new_mark
@@ -139,7 +139,7 @@ def update
139
139
#
140
140
# @raise [Concurrent::ConcurrentUpdateError] if the update fails
141
141
def try_update!
142
- old_val , old_mark = @Reference . get
142
+ old_val , old_mark = reference
143
143
new_val , new_mark = yield old_val , old_mark
144
144
145
145
unless compare_and_set old_val , new_val , old_mark , new_mark
@@ -165,7 +165,7 @@ def try_update!
165
165
# @return [ImmutableArray] the new value and marked state, or nil if
166
166
# the update failed
167
167
def try_update
168
- old_val , old_mark = @Reference . get
168
+ old_val , old_mark = reference
169
169
new_val , new_mark = yield old_val , old_mark
170
170
171
171
return unless compare_and_set old_val , new_val , old_mark , new_mark
0 commit comments