equal
deleted
inserted
replaced
72 |
72 |
73 bool try_set() { |
73 bool try_set() { |
74 if (is_set()) { |
74 if (is_set()) { |
75 return false; |
75 return false; |
76 } |
76 } |
77 ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)SET, &value, (ShenandoahSharedValue)UNSET); |
77 ShenandoahSharedValue old = Atomic::cmpxchg(&value, (ShenandoahSharedValue)UNSET, (ShenandoahSharedValue)SET); |
78 return old == UNSET; // success |
78 return old == UNSET; // success |
79 } |
79 } |
80 |
80 |
81 bool try_unset() { |
81 bool try_unset() { |
82 if (!is_set()) { |
82 if (!is_set()) { |
83 return false; |
83 return false; |
84 } |
84 } |
85 ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)UNSET, &value, (ShenandoahSharedValue)SET); |
85 ShenandoahSharedValue old = Atomic::cmpxchg(&value, (ShenandoahSharedValue)SET, (ShenandoahSharedValue)UNSET); |
86 return old == SET; // success |
86 return old == SET; // success |
87 } |
87 } |
88 |
88 |
89 volatile ShenandoahSharedValue* addr_of() { |
89 volatile ShenandoahSharedValue* addr_of() { |
90 return &value; |
90 return &value; |
123 // already set |
123 // already set |
124 return; |
124 return; |
125 } |
125 } |
126 |
126 |
127 ShenandoahSharedValue nv = ov | mask_val; |
127 ShenandoahSharedValue nv = ov | mask_val; |
128 if (Atomic::cmpxchg(nv, &value, ov) == ov) { |
128 if (Atomic::cmpxchg(&value, ov, nv) == ov) { |
129 // successfully set |
129 // successfully set |
130 return; |
130 return; |
131 } |
131 } |
132 } |
132 } |
133 } |
133 } |
141 // already unset |
141 // already unset |
142 return; |
142 return; |
143 } |
143 } |
144 |
144 |
145 ShenandoahSharedValue nv = ov & ~mask_val; |
145 ShenandoahSharedValue nv = ov & ~mask_val; |
146 if (Atomic::cmpxchg(nv, &value, ov) == ov) { |
146 if (Atomic::cmpxchg(&value, ov, nv) == ov) { |
147 // successfully unset |
147 // successfully unset |
148 return; |
148 return; |
149 } |
149 } |
150 } |
150 } |
151 } |
151 } |
219 } |
219 } |
220 |
220 |
221 T cmpxchg(T new_value, T expected) { |
221 T cmpxchg(T new_value, T expected) { |
222 assert (new_value >= 0, "sanity"); |
222 assert (new_value >= 0, "sanity"); |
223 assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
223 assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
224 return (T)Atomic::cmpxchg((ShenandoahSharedValue)new_value, &value, (ShenandoahSharedValue)expected); |
224 return (T)Atomic::cmpxchg(&value, (ShenandoahSharedValue)expected, (ShenandoahSharedValue)new_value); |
225 } |
225 } |
226 |
226 |
227 volatile ShenandoahSharedValue* addr_of() { |
227 volatile ShenandoahSharedValue* addr_of() { |
228 return &value; |
228 return &value; |
229 } |
229 } |