equal
deleted
inserted
replaced
45 ShenandoahSharedFlag() { |
45 ShenandoahSharedFlag() { |
46 unset(); |
46 unset(); |
47 } |
47 } |
48 |
48 |
49 void set() { |
49 void set() { |
50 OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)SET); |
50 Atomic::release_store_fence(&value, (ShenandoahSharedValue)SET); |
51 } |
51 } |
52 |
52 |
53 void unset() { |
53 void unset() { |
54 OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)UNSET); |
54 Atomic::release_store_fence(&value, (ShenandoahSharedValue)UNSET); |
55 } |
55 } |
56 |
56 |
57 bool is_set() const { |
57 bool is_set() const { |
58 return OrderAccess::load_acquire(&value) == SET; |
58 return Atomic::load_acquire(&value) == SET; |
59 } |
59 } |
60 |
60 |
61 bool is_unset() const { |
61 bool is_unset() const { |
62 return OrderAccess::load_acquire(&value) == UNSET; |
62 return Atomic::load_acquire(&value) == UNSET; |
63 } |
63 } |
64 |
64 |
65 void set_cond(bool val) { |
65 void set_cond(bool val) { |
66 if (val) { |
66 if (val) { |
67 set(); |
67 set(); |
116 |
116 |
117 void set(uint mask) { |
117 void set(uint mask) { |
118 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
118 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
119 ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask; |
119 ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask; |
120 while (true) { |
120 while (true) { |
121 ShenandoahSharedValue ov = OrderAccess::load_acquire(&value); |
121 ShenandoahSharedValue ov = Atomic::load_acquire(&value); |
122 if ((ov & mask_val) != 0) { |
122 if ((ov & mask_val) != 0) { |
123 // already set |
123 // already set |
124 return; |
124 return; |
125 } |
125 } |
126 |
126 |
134 |
134 |
135 void unset(uint mask) { |
135 void unset(uint mask) { |
136 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
136 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
137 ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask; |
137 ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask; |
138 while (true) { |
138 while (true) { |
139 ShenandoahSharedValue ov = OrderAccess::load_acquire(&value); |
139 ShenandoahSharedValue ov = Atomic::load_acquire(&value); |
140 if ((ov & mask_val) == 0) { |
140 if ((ov & mask_val) == 0) { |
141 // already unset |
141 // already unset |
142 return; |
142 return; |
143 } |
143 } |
144 |
144 |
149 } |
149 } |
150 } |
150 } |
151 } |
151 } |
152 |
152 |
153 void clear() { |
153 void clear() { |
154 OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)0); |
154 Atomic::release_store_fence(&value, (ShenandoahSharedValue)0); |
155 } |
155 } |
156 |
156 |
157 bool is_set(uint mask) const { |
157 bool is_set(uint mask) const { |
158 return !is_unset(mask); |
158 return !is_unset(mask); |
159 } |
159 } |
160 |
160 |
161 bool is_unset(uint mask) const { |
161 bool is_unset(uint mask) const { |
162 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
162 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
163 return (OrderAccess::load_acquire(&value) & (ShenandoahSharedValue) mask) == 0; |
163 return (Atomic::load_acquire(&value) & (ShenandoahSharedValue) mask) == 0; |
164 } |
164 } |
165 |
165 |
166 bool is_clear() const { |
166 bool is_clear() const { |
167 return (OrderAccess::load_acquire(&value)) == 0; |
167 return (Atomic::load_acquire(&value)) == 0; |
168 } |
168 } |
169 |
169 |
170 void set_cond(uint mask, bool val) { |
170 void set_cond(uint mask, bool val) { |
171 if (val) { |
171 if (val) { |
172 set(mask); |
172 set(mask); |
209 } |
209 } |
210 |
210 |
211 void set(T v) { |
211 void set(T v) { |
212 assert (v >= 0, "sanity"); |
212 assert (v >= 0, "sanity"); |
213 assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
213 assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity"); |
214 OrderAccess::release_store_fence(&value, (ShenandoahSharedValue)v); |
214 Atomic::release_store_fence(&value, (ShenandoahSharedValue)v); |
215 } |
215 } |
216 |
216 |
217 T get() const { |
217 T get() const { |
218 return (T)OrderAccess::load_acquire(&value); |
218 return (T)Atomic::load_acquire(&value); |
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"); |