Skip to content

Commit 24cf480

Browse files
committed
8276047: G1: refactor G1CardSetArrayLocker
Reviewed-by: tschatzl, sjohanss
1 parent e922023 commit 24cf480

File tree

2 files changed

+17
-18
lines changed

2 files changed

+17
-18
lines changed

src/hotspot/share/gc/g1/g1CardSetContainers.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -196,19 +196,19 @@ class G1CardSetArray : public G1CardSetContainer {
196196
static const EntryCountType EntryMask = LockBitMask - 1;
197197

198198
class G1CardSetArrayLocker : public StackObj {
199-
EntryCountType volatile* _value;
200-
EntryCountType volatile _original_value;
201-
bool _success;
199+
EntryCountType volatile* _num_entries_addr;
200+
EntryCountType _local_num_entries;
202201
public:
203202
G1CardSetArrayLocker(EntryCountType volatile* value);
204203

205-
EntryCountType num_entries() const { return _original_value; }
206-
void inc_num_entries() { _success = true; }
204+
EntryCountType num_entries() const { return _local_num_entries; }
205+
void inc_num_entries() {
206+
assert(((_local_num_entries + 1) & EntryMask) == (EntryCountType)(_local_num_entries + 1), "no overflow" );
207+
_local_num_entries++;
208+
}
207209

208210
~G1CardSetArrayLocker() {
209-
assert(((_original_value + _success) & EntryMask) == (EntryCountType)(_original_value + _success), "precondition!" );
210-
211-
Atomic::release_store(_value, (EntryCountType)(_original_value + _success));
211+
Atomic::release_store(_num_entries_addr, _local_num_entries);
212212
}
213213
};
214214

src/hotspot/share/gc/g1/g1CardSetContainers.inline.hpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,22 +145,21 @@ inline G1CardSetArray::G1CardSetArray(uint card_in_region, EntryCountType num_el
145145
_data[0] = card_in_region;
146146
}
147147

148-
inline G1CardSetArray::G1CardSetArrayLocker::G1CardSetArrayLocker(EntryCountType volatile* value) :
149-
_value(value),
150-
_success(false) {
148+
inline G1CardSetArray::G1CardSetArrayLocker::G1CardSetArrayLocker(EntryCountType volatile* num_entries_addr) :
149+
_num_entries_addr(num_entries_addr) {
151150
SpinYield s;
152-
EntryCountType original_value = (*_value) & EntryMask;
151+
EntryCountType num_entries = Atomic::load(_num_entries_addr) & EntryMask;
153152
while (true) {
154-
EntryCountType old_value = Atomic::cmpxchg(_value,
155-
original_value,
156-
(EntryCountType)(original_value | LockBitMask));
157-
if (old_value == original_value) {
153+
EntryCountType old_value = Atomic::cmpxchg(_num_entries_addr,
154+
num_entries,
155+
(EntryCountType)(num_entries | LockBitMask));
156+
if (old_value == num_entries) {
158157
// Succeeded locking the array.
159-
_original_value = original_value;
158+
_local_num_entries = num_entries;
160159
break;
161160
}
162161
// Failed. Retry (with the lock bit stripped again).
163-
original_value = old_value & EntryMask;
162+
num_entries = old_value & EntryMask;
164163
s.wait();
165164
}
166165
}

0 commit comments

Comments
 (0)