8213373: Bulk MarkBitMap clearing methods
Reviewed-by: rkennke, zgu
This commit is contained in:
parent
cc8ee84d59
commit
c8ebf4da3b
@ -44,14 +44,19 @@ void MarkBitMap::initialize(MemRegion heap, MemRegion storage) {
|
|||||||
_bm = BitMapView((BitMap::bm_word_t*) storage.start(), _covered.word_size() >> _shifter);
|
_bm = BitMapView((BitMap::bm_word_t*) storage.start(), _covered.word_size() >> _shifter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MarkBitMap::clear_range(MemRegion mr) {
|
void MarkBitMap::do_clear(MemRegion mr, bool large) {
|
||||||
MemRegion intersection = mr.intersection(_covered);
|
MemRegion intersection = mr.intersection(_covered);
|
||||||
assert(!intersection.is_empty(),
|
assert(!intersection.is_empty(),
|
||||||
"Given range from " PTR_FORMAT " to " PTR_FORMAT " is completely outside the heap",
|
"Given range from " PTR_FORMAT " to " PTR_FORMAT " is completely outside the heap",
|
||||||
p2i(mr.start()), p2i(mr.end()));
|
p2i(mr.start()), p2i(mr.end()));
|
||||||
// convert address range into offset range
|
// convert address range into offset range
|
||||||
_bm.at_put_range(addr_to_offset(intersection.start()),
|
size_t beg = addr_to_offset(intersection.start());
|
||||||
addr_to_offset(intersection.end()), false);
|
size_t end = addr_to_offset(intersection.end());
|
||||||
|
if (large) {
|
||||||
|
_bm.clear_large_range(beg, end);
|
||||||
|
} else {
|
||||||
|
_bm.clear_range(beg, end);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
|
@ -49,6 +49,10 @@ protected:
|
|||||||
size_t addr_to_offset(const HeapWord* addr) const {
|
size_t addr_to_offset(const HeapWord* addr) const {
|
||||||
return pointer_delta(addr, _covered.start()) >> _shifter;
|
return pointer_delta(addr, _covered.start()) >> _shifter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear bitmap range
|
||||||
|
void do_clear(MemRegion mr, bool large);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static size_t compute_size(size_t heap_size);
|
static size_t compute_size(size_t heap_size);
|
||||||
// Returns the amount of bytes on the heap between two marks in the bitmap.
|
// Returns the amount of bytes on the heap between two marks in the bitmap.
|
||||||
@ -88,7 +92,10 @@ public:
|
|||||||
inline bool par_mark(HeapWord* addr);
|
inline bool par_mark(HeapWord* addr);
|
||||||
inline bool par_mark(oop obj);
|
inline bool par_mark(oop obj);
|
||||||
|
|
||||||
void clear_range(MemRegion mr);
|
// Clear bitmap.
|
||||||
|
void clear() { do_clear(_covered, true); }
|
||||||
|
void clear_range(MemRegion mr) { do_clear(mr, false); }
|
||||||
|
void clear_range_large(MemRegion mr) { do_clear(mr, true); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SHARE_VM_GC_SHARED_MARKBITMAP_HPP
|
#endif // SHARE_VM_GC_SHARED_MARKBITMAP_HPP
|
||||||
|
Loading…
Reference in New Issue
Block a user