< prev index next >
src/share/vm/gc/shenandoah/shenandoahHeap.inline.hpp
Print this page
rev 14453 : Remove secondary marking bitmap.
*** 61,71 ****
/*
* Marks the object. Returns true if the object has not been marked before and has
* been marked by this thread. Returns false if the object has already been marked,
* or if a competing thread succeeded in marking this object.
*/
! inline bool ShenandoahHeap::mark_next(oop obj) const {
#ifdef ASSERT
if (! oopDesc::unsafe_equals(obj, oopDesc::bs()->read_barrier(obj))) {
tty->print_cr("heap region containing obj:");
ShenandoahHeapRegion* obj_region = heap_region_containing(obj);
obj_region->print();
--- 61,71 ----
/*
* Marks the object. Returns true if the object has not been marked before and has
* been marked by this thread. Returns false if the object has already been marked,
* or if a competing thread succeeded in marking this object.
*/
! inline bool ShenandoahHeap::mark(oop obj) {
#ifdef ASSERT
if (! oopDesc::unsafe_equals(obj, oopDesc::bs()->read_barrier(obj))) {
tty->print_cr("heap region containing obj:");
ShenandoahHeapRegion* obj_region = heap_region_containing(obj);
obj_region->print();
*** 74,99 ****
forward_region->print();
}
#endif
assert(oopDesc::unsafe_equals(obj, oopDesc::bs()->read_barrier(obj)), "only mark forwarded copy of objects");
! return mark_next_no_checks(obj);
}
! inline bool ShenandoahHeap::mark_next_no_checks(oop obj) const {
HeapWord* addr = (HeapWord*) obj;
! return (! allocated_after_next_mark_start(addr)) && _next_mark_bit_map->parMark(addr);
}
! inline bool ShenandoahHeap::is_marked_next(oop obj) const {
HeapWord* addr = (HeapWord*) obj;
! return allocated_after_next_mark_start(addr) || _next_mark_bit_map->isMarked(addr);
! }
!
! inline bool ShenandoahHeap::is_marked_complete(oop obj) const {
! HeapWord* addr = (HeapWord*) obj;
! return allocated_after_complete_mark_start(addr) || _complete_mark_bit_map->isMarked(addr);
}
inline bool ShenandoahHeap::need_update_refs() const {
return _need_update_refs;
}
--- 74,94 ----
forward_region->print();
}
#endif
assert(oopDesc::unsafe_equals(obj, oopDesc::bs()->read_barrier(obj)), "only mark forwarded copy of objects");
! return mark_no_checks(obj);
}
! inline bool ShenandoahHeap::mark_no_checks(oop obj) {
HeapWord* addr = (HeapWord*) obj;
! return !allocated_after_mark_start(addr) && _mark_bit_map.parMark(addr);
}
! inline bool ShenandoahHeap::is_marked(oop obj) const {
HeapWord* addr = (HeapWord*) obj;
! return allocated_after_mark_start(addr) || _mark_bit_map.isMarked(addr);
}
inline bool ShenandoahHeap::need_update_refs() const {
return _need_update_refs;
}
*** 426,436 ****
if (is_concurrent_partial_in_progress()) {
assert(! in_collection_set((oop) entry), "must not get cset objects here");
// assert(free_regions()->contains(heap_region_containing(entry)), "expect to-space object");
return true;
} else if (concurrent_mark_in_progress()) {
! return ! is_marked_next(oop(entry));
} else {
return false;
}
}
--- 421,431 ----
if (is_concurrent_partial_in_progress()) {
assert(! in_collection_set((oop) entry), "must not get cset objects here");
// assert(free_regions()->contains(heap_region_containing(entry)), "expect to-space object");
return true;
} else if (concurrent_mark_in_progress()) {
! return ! is_marked(oop(entry));
} else {
return false;
}
}
*** 470,489 ****
inline address ShenandoahHeap::evacuation_in_progress_addr() {
return (address) &(ShenandoahHeap::heap()->_evacuation_in_progress);
}
! inline bool ShenandoahHeap::allocated_after_next_mark_start(HeapWord* addr) const {
! uintx index = ((uintx) addr) >> ShenandoahHeapRegion::region_size_bytes_shift();
! HeapWord* top_at_mark_start = _next_top_at_mark_starts[index];
! bool alloc_after_mark_start = addr >= top_at_mark_start;
! return alloc_after_mark_start;
! }
!
! inline bool ShenandoahHeap::allocated_after_complete_mark_start(HeapWord* addr) const {
uintx index = ((uintx) addr) >> ShenandoahHeapRegion::region_size_bytes_shift();
! HeapWord* top_at_mark_start = _complete_top_at_mark_starts[index];
bool alloc_after_mark_start = addr >= top_at_mark_start;
return alloc_after_mark_start;
}
template<class T>
--- 465,477 ----
inline address ShenandoahHeap::evacuation_in_progress_addr() {
return (address) &(ShenandoahHeap::heap()->_evacuation_in_progress);
}
! inline bool ShenandoahHeap::allocated_after_mark_start(HeapWord* addr) const {
uintx index = ((uintx) addr) >> ShenandoahHeapRegion::region_size_bytes_shift();
! HeapWord* top_at_mark_start = _top_at_mark_starts[index];
bool alloc_after_mark_start = addr >= top_at_mark_start;
return alloc_after_mark_start;
}
template<class T>
*** 499,518 ****
template<class T>
inline void ShenandoahHeap::marked_object_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit) {
assert(BrooksPointer::word_offset() < 0, "skip_delta calculation below assumes the forwarding ptr is before obj");
assert(! region->is_humongous_continuation(), "no humongous continuation regions here");
! MarkBitMap* mark_bit_map = _complete_mark_bit_map;
! HeapWord* top_at_mark_start = complete_top_at_mark_start(region->bottom());
size_t skip_bitmap_delta = BrooksPointer::word_size() + 1;
size_t skip_objsize_delta = BrooksPointer::word_size() /* + actual obj.size() below */;
HeapWord* start = region->bottom() + BrooksPointer::word_size();
! HeapWord* end = MIN2(top_at_mark_start + BrooksPointer::word_size(), region->end());
! HeapWord* addr = mark_bit_map->getNextMarkedWordAddress(start, end);
intx dist = ShenandoahMarkScanPrefetch;
if (dist > 0) {
// Batched scan that prefetches the oop data, anticipating the access to
// either header, oop field, or forwarding pointer. Not that we cannot
--- 487,507 ----
template<class T>
inline void ShenandoahHeap::marked_object_iterate(ShenandoahHeapRegion* region, T* cl, HeapWord* limit) {
assert(BrooksPointer::word_offset() < 0, "skip_delta calculation below assumes the forwarding ptr is before obj");
assert(! region->is_humongous_continuation(), "no humongous continuation regions here");
+ assert(is_bitmap_valid(), "only try this with complete marking bitmap");
! MarkBitMap mark_bit_map = _mark_bit_map;
! HeapWord* tams = top_at_mark_start(region->bottom());
size_t skip_bitmap_delta = BrooksPointer::word_size() + 1;
size_t skip_objsize_delta = BrooksPointer::word_size() /* + actual obj.size() below */;
HeapWord* start = region->bottom() + BrooksPointer::word_size();
! HeapWord* end = MIN2(tams + BrooksPointer::word_size(), region->end());
! HeapWord* addr = mark_bit_map.getNextMarkedWordAddress(start, end);
intx dist = ShenandoahMarkScanPrefetch;
if (dist > 0) {
// Batched scan that prefetches the oop data, anticipating the access to
// either header, oop field, or forwarding pointer. Not that we cannot
*** 535,587 ****
avail = 0;
for (int c = 0; (c < dist) && (addr < limit); c++) {
Prefetch::read(addr, BrooksPointer::byte_offset());
oop obj = oop(addr);
slots[avail++] = obj;
! if (addr < top_at_mark_start) {
addr += skip_bitmap_delta;
! addr = mark_bit_map->getNextMarkedWordAddress(addr, end);
} else {
// cannot trust mark bitmap anymore, finish the current stride,
// and switch to accurate traversal
addr += obj->size() + skip_objsize_delta;
aborting = true;
}
}
for (int c = 0; c < avail; c++) {
! do_marked_object(mark_bit_map, cl, slots[c]);
}
} while (avail > 0 && !aborting);
// accurate traversal
while (addr < limit) {
oop obj = oop(addr);
int size = obj->size();
! do_marked_object(mark_bit_map, cl, obj);
addr += size + skip_objsize_delta;
}
} else {
while (addr < limit) {
oop obj = oop(addr);
int size = obj->size();
! do_marked_object(mark_bit_map, cl, obj);
addr += size + skip_objsize_delta;
! if (addr < top_at_mark_start) {
! addr = mark_bit_map->getNextMarkedWordAddress(addr, end);
}
}
}
}
template<class T>
! inline void ShenandoahHeap::do_marked_object(MarkBitMap* bitmap, T* cl, oop obj) {
assert(!oopDesc::is_null(obj), "sanity");
assert(oopDesc::is_oop(obj), "sanity");
assert(is_in(obj), "sanity");
! assert(bitmap == _complete_mark_bit_map, "only iterate completed mark bitmap");
! assert(is_marked_complete(obj), "object expected to be marked");
cl->do_object(obj);
}
template <class T>
class ShenandoahObjectToOopClosure : public ObjectClosure {
--- 524,575 ----
avail = 0;
for (int c = 0; (c < dist) && (addr < limit); c++) {
Prefetch::read(addr, BrooksPointer::byte_offset());
oop obj = oop(addr);
slots[avail++] = obj;
! if (addr < tams) {
addr += skip_bitmap_delta;
! addr = mark_bit_map.getNextMarkedWordAddress(addr, end);
} else {
// cannot trust mark bitmap anymore, finish the current stride,
// and switch to accurate traversal
addr += obj->size() + skip_objsize_delta;
aborting = true;
}
}
for (int c = 0; c < avail; c++) {
! do_marked_object(cl, slots[c]);
}
} while (avail > 0 && !aborting);
// accurate traversal
while (addr < limit) {
oop obj = oop(addr);
int size = obj->size();
! do_marked_object(cl, obj);
addr += size + skip_objsize_delta;
}
} else {
while (addr < limit) {
oop obj = oop(addr);
int size = obj->size();
! do_marked_object(cl, obj);
addr += size + skip_objsize_delta;
! if (addr < tams) {
! addr = mark_bit_map.getNextMarkedWordAddress(addr, end);
}
}
}
}
template<class T>
! inline void ShenandoahHeap::do_marked_object(T* cl, oop obj) {
assert(!oopDesc::is_null(obj), "sanity");
assert(oopDesc::is_oop(obj), "sanity");
assert(is_in(obj), "sanity");
! assert(is_marked(obj), "object expected to be marked");
cl->do_object(obj);
}
template <class T>
class ShenandoahObjectToOopClosure : public ObjectClosure {
< prev index next >