57 bool is_set() const {
58 return Atomic::load_acquire(&value) == SET;
59 }
60
61 bool is_unset() const {
62 return Atomic::load_acquire(&value) == UNSET;
63 }
64
65 void set_cond(bool val) {
66 if (val) {
67 set();
68 } else {
69 unset();
70 }
71 }
72
73 bool try_set() {
74 if (is_set()) {
75 return false;
76 }
77 ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)SET, &value, (ShenandoahSharedValue)UNSET);
78 return old == UNSET; // success
79 }
80
81 bool try_unset() {
82 if (!is_set()) {
83 return false;
84 }
85 ShenandoahSharedValue old = Atomic::cmpxchg((ShenandoahSharedValue)UNSET, &value, (ShenandoahSharedValue)SET);
86 return old == SET; // success
87 }
88
89 volatile ShenandoahSharedValue* addr_of() {
90 return &value;
91 }
92
93 private:
94 volatile ShenandoahSharedValue* operator&() {
95 fatal("Use addr_of() instead");
96 return NULL;
97 }
98
99 bool operator==(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
100 bool operator!=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
101 bool operator> (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
102 bool operator>=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
103 bool operator< (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
104 bool operator<=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
105
108 typedef struct ShenandoahSharedBitmap {
109 DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile ShenandoahSharedValue));
110 volatile ShenandoahSharedValue value;
111 DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
112
113 ShenandoahSharedBitmap() {
114 clear();
115 }
116
117 void set(uint mask) {
118 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
119 ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
120 while (true) {
121 ShenandoahSharedValue ov = Atomic::load_acquire(&value);
122 if ((ov & mask_val) != 0) {
123 // already set
124 return;
125 }
126
127 ShenandoahSharedValue nv = ov | mask_val;
128 if (Atomic::cmpxchg(nv, &value, ov) == ov) {
129 // successfully set
130 return;
131 }
132 }
133 }
134
135 void unset(uint mask) {
136 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
137 ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
138 while (true) {
139 ShenandoahSharedValue ov = Atomic::load_acquire(&value);
140 if ((ov & mask_val) == 0) {
141 // already unset
142 return;
143 }
144
145 ShenandoahSharedValue nv = ov & ~mask_val;
146 if (Atomic::cmpxchg(nv, &value, ov) == ov) {
147 // successfully unset
148 return;
149 }
150 }
151 }
152
153 void clear() {
154 Atomic::release_store_fence(&value, (ShenandoahSharedValue)0);
155 }
156
157 bool is_set(uint mask) const {
158 return !is_unset(mask);
159 }
160
161 bool is_unset(uint mask) const {
162 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
163 return (Atomic::load_acquire(&value) & (ShenandoahSharedValue) mask) == 0;
164 }
165
166 bool is_clear() const {
204 volatile ShenandoahSharedValue value;
205 DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
206
207 ShenandoahSharedEnumFlag() {
208 value = 0;
209 }
210
211 void set(T v) {
212 assert (v >= 0, "sanity");
213 assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
214 Atomic::release_store_fence(&value, (ShenandoahSharedValue)v);
215 }
216
217 T get() const {
218 return (T)Atomic::load_acquire(&value);
219 }
220
221 T cmpxchg(T new_value, T expected) {
222 assert (new_value >= 0, "sanity");
223 assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
224 return (T)Atomic::cmpxchg((ShenandoahSharedValue)new_value, &value, (ShenandoahSharedValue)expected);
225 }
226
227 volatile ShenandoahSharedValue* addr_of() {
228 return &value;
229 }
230
231 private:
232 volatile T* operator&() {
233 fatal("Use addr_of() instead");
234 return NULL;
235 }
236
237 bool operator==(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
238 bool operator!=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
239 bool operator> (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
240 bool operator>=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
241 bool operator< (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
242 bool operator<=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
243
244 };
|
57 bool is_set() const {
58 return Atomic::load_acquire(&value) == SET;
59 }
60
61 bool is_unset() const {
62 return Atomic::load_acquire(&value) == UNSET;
63 }
64
65 void set_cond(bool val) {
66 if (val) {
67 set();
68 } else {
69 unset();
70 }
71 }
72
73 bool try_set() {
74 if (is_set()) {
75 return false;
76 }
77 ShenandoahSharedValue old = Atomic::cmpxchg(&value, (ShenandoahSharedValue)UNSET, (ShenandoahSharedValue)SET);
78 return old == UNSET; // success
79 }
80
81 bool try_unset() {
82 if (!is_set()) {
83 return false;
84 }
85 ShenandoahSharedValue old = Atomic::cmpxchg(&value, (ShenandoahSharedValue)SET, (ShenandoahSharedValue)UNSET);
86 return old == SET; // success
87 }
88
89 volatile ShenandoahSharedValue* addr_of() {
90 return &value;
91 }
92
93 private:
94 volatile ShenandoahSharedValue* operator&() {
95 fatal("Use addr_of() instead");
96 return NULL;
97 }
98
99 bool operator==(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
100 bool operator!=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
101 bool operator> (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
102 bool operator>=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
103 bool operator< (ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
104 bool operator<=(ShenandoahSharedFlag& other) { fatal("Use is_set() instead"); return false; }
105
108 typedef struct ShenandoahSharedBitmap {
109 DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE, sizeof(volatile ShenandoahSharedValue));
110 volatile ShenandoahSharedValue value;
111 DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
112
113 ShenandoahSharedBitmap() {
114 clear();
115 }
116
117 void set(uint mask) {
118 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
119 ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
120 while (true) {
121 ShenandoahSharedValue ov = Atomic::load_acquire(&value);
122 if ((ov & mask_val) != 0) {
123 // already set
124 return;
125 }
126
127 ShenandoahSharedValue nv = ov | mask_val;
128 if (Atomic::cmpxchg(&value, ov, nv) == ov) {
129 // successfully set
130 return;
131 }
132 }
133 }
134
135 void unset(uint mask) {
136 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
137 ShenandoahSharedValue mask_val = (ShenandoahSharedValue) mask;
138 while (true) {
139 ShenandoahSharedValue ov = Atomic::load_acquire(&value);
140 if ((ov & mask_val) == 0) {
141 // already unset
142 return;
143 }
144
145 ShenandoahSharedValue nv = ov & ~mask_val;
146 if (Atomic::cmpxchg(&value, ov, nv) == ov) {
147 // successfully unset
148 return;
149 }
150 }
151 }
152
153 void clear() {
154 Atomic::release_store_fence(&value, (ShenandoahSharedValue)0);
155 }
156
157 bool is_set(uint mask) const {
158 return !is_unset(mask);
159 }
160
161 bool is_unset(uint mask) const {
162 assert (mask < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
163 return (Atomic::load_acquire(&value) & (ShenandoahSharedValue) mask) == 0;
164 }
165
166 bool is_clear() const {
204 volatile ShenandoahSharedValue value;
205 DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, 0);
206
207 ShenandoahSharedEnumFlag() {
208 value = 0;
209 }
210
211 void set(T v) {
212 assert (v >= 0, "sanity");
213 assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
214 Atomic::release_store_fence(&value, (ShenandoahSharedValue)v);
215 }
216
217 T get() const {
218 return (T)Atomic::load_acquire(&value);
219 }
220
221 T cmpxchg(T new_value, T expected) {
222 assert (new_value >= 0, "sanity");
223 assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
224 return (T)Atomic::cmpxchg(&value, (ShenandoahSharedValue)expected, (ShenandoahSharedValue)new_value);
225 }
226
227 volatile ShenandoahSharedValue* addr_of() {
228 return &value;
229 }
230
231 private:
232 volatile T* operator&() {
233 fatal("Use addr_of() instead");
234 return NULL;
235 }
236
237 bool operator==(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
238 bool operator!=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
239 bool operator> (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
240 bool operator>=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
241 bool operator< (ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
242 bool operator<=(ShenandoahSharedEnumFlag& other) { fatal("Use get() instead"); return false; }
243
244 };
|