1
- module Edge
2
- module Concurrent
1
+ module Concurrent
2
+ module Edge
3
3
# @!macro atomic_markable_reference
4
4
class AtomicMarkableReference < ::Concurrent ::Synchronization ::Object
5
- # TODO: Remove once out of edge module
6
- include ::Concurrent
7
-
8
5
# @!macro [attach] atomic_markable_reference_method_initialize
9
6
def initialize ( value = nil , mark = false )
10
7
super
@@ -85,9 +82,7 @@ def mark
85
82
#
86
83
# @return [ImmutableArray] both the new value and the new mark
87
84
def set ( new_val , new_mark )
88
- ImmutableArray [ new_val , new_mark ] . tap do |pair |
89
- @Reference . set pair
90
- end
85
+ @Reference . set ImmutableArray [ new_val , new_mark ]
91
86
end
92
87
93
88
# @!macro [attach] atomic_markable_reference_method_update
@@ -104,7 +99,7 @@ def set(new_val, new_mark)
104
99
# @return [ImmutableArray] the new value and new mark
105
100
def update
106
101
loop do
107
- old_val , old_mark = value , marked?
102
+ old_val , old_mark = @Reference . get
108
103
new_val , new_mark = yield old_val , old_mark
109
104
110
105
if compare_and_set old_val , new_val , old_mark , new_mark
@@ -128,7 +123,7 @@ def update
128
123
#
129
124
# @raise [Concurrent::ConcurrentUpdateError] if the update fails
130
125
def try_update
131
- old_val , old_mark = value , marked?
126
+ old_val , old_mark = @Reference . get
132
127
new_val , new_mark = yield old_val , old_mark
133
128
134
129
unless compare_and_set old_val , new_val , old_mark , new_mark
0 commit comments