569 inline bool ParallelCompactData::RegionData::claim_unsafe()
570 {
571 if (available()) {
572 _dc_and_los |= dc_claimed;
573 return true;
574 }
575 return false;
576 }
577
578 inline void ParallelCompactData::RegionData::add_live_obj(size_t words)
579 {
580 assert(words <= (size_t)los_mask - live_obj_size(), "overflow");
581 Atomic::add((int) words, (volatile int*) &_dc_and_los);
582 }
583
584 inline void ParallelCompactData::RegionData::set_highest_ref(HeapWord* addr)
585 {
586 #ifdef ASSERT
587 HeapWord* tmp = _highest_ref;
588 while (addr > tmp) {
589 tmp = (HeapWord*)Atomic::cmpxchg_ptr(addr, &_highest_ref, tmp);
590 }
591 #endif // #ifdef ASSERT
592 }
593
594 inline bool ParallelCompactData::RegionData::claim()
595 {
596 const region_sz_t los = static_cast<region_sz_t>(live_obj_size());
597 const region_sz_t old = Atomic::cmpxchg(dc_claimed | los, &_dc_and_los, los);
598 return old == los;
599 }
600
601 inline ParallelCompactData::RegionData*
602 ParallelCompactData::region(size_t region_idx) const
603 {
604 assert(region_idx <= region_count(), "bad arg");
605 return _region_data + region_idx;
606 }
607
608 inline size_t
609 ParallelCompactData::region(const RegionData* const region_ptr) const
|
569 inline bool ParallelCompactData::RegionData::claim_unsafe()
570 {
571 if (available()) {
572 _dc_and_los |= dc_claimed;
573 return true;
574 }
575 return false;
576 }
577
578 inline void ParallelCompactData::RegionData::add_live_obj(size_t words)
579 {
580 assert(words <= (size_t)los_mask - live_obj_size(), "overflow");
581 Atomic::add((int) words, (volatile int*) &_dc_and_los);
582 }
583
584 inline void ParallelCompactData::RegionData::set_highest_ref(HeapWord* addr)
585 {
586 #ifdef ASSERT
587 HeapWord* tmp = _highest_ref;
588 while (addr > tmp) {
589 tmp = Atomic::cmpxchg(addr, &_highest_ref, tmp);
590 }
591 #endif // #ifdef ASSERT
592 }
593
594 inline bool ParallelCompactData::RegionData::claim()
595 {
596 const region_sz_t los = static_cast<region_sz_t>(live_obj_size());
597 const region_sz_t old = Atomic::cmpxchg(dc_claimed | los, &_dc_and_los, los);
598 return old == los;
599 }
600
601 inline ParallelCompactData::RegionData*
602 ParallelCompactData::region(size_t region_idx) const
603 {
604 assert(region_idx <= region_count(), "bad arg");
605 return _region_data + region_idx;
606 }
607
608 inline size_t
609 ParallelCompactData::region(const RegionData* const region_ptr) const
|