< prev index next >

src/hotspot/share/gc/g1/g1FreeIdSet.cpp

Print this page
rev 53151 : [mq]: tschatzl_review

*** 28,39 **** #include "runtime/atomic.hpp" #include "utilities/debug.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/macros.hpp" - const uint claimed = UINT_MAX; - G1FreeIdSet::G1FreeIdSet(uint start, uint size) : _sem(size), // counting semaphore for available ids _next(NULL), // array of "next" indices _start(start), // first id value _size(size), // number of available ids --- 28,37 ----
*** 66,75 **** --- 64,75 ---- uintx G1FreeIdSet::make_head(uint index, uintx old_head) const { // Include incremented old update counter to avoid ABA problem. return index | ((old_head & ~_head_index_mask) + 1 + _head_index_mask); } + const uint Claimed = UINT_MAX; + uint G1FreeIdSet::claim_par_id() { _sem.wait(); // Semaphore gate permits passage by no more than the number of // available ids, so there must be one that we can claim. But there // may be multiple threads trying to claim ids at the same time.
*** 81,98 **** uintx new_head = make_head(_next[index], old_head); new_head = Atomic::cmpxchg(new_head, &_head, old_head); if (new_head == old_head) break; old_head = new_head; } ! DEBUG_ONLY(_next[index] = claimed;) return _start + index; } void G1FreeIdSet::release_par_id(uint id) { uint index = id - _start; assert(index < _size, "invalid id %u", id); ! assert(_next[index] == claimed, "precondition"); uintx old_head = Atomic::load(&_head); while (true) { _next[index] = head_index(old_head); uintx new_head = make_head(index, old_head); new_head = Atomic::cmpxchg(new_head, &_head, old_head); --- 81,98 ---- uintx new_head = make_head(_next[index], old_head); new_head = Atomic::cmpxchg(new_head, &_head, old_head); if (new_head == old_head) break; old_head = new_head; } ! DEBUG_ONLY(_next[index] = Claimed;) return _start + index; } void G1FreeIdSet::release_par_id(uint id) { uint index = id - _start; assert(index < _size, "invalid id %u", id); ! assert(_next[index] == Claimed, "precondition"); uintx old_head = Atomic::load(&_head); while (true) { _next[index] = head_index(old_head); uintx new_head = make_head(index, old_head); new_head = Atomic::cmpxchg(new_head, &_head, old_head);
< prev index next >