< prev index next >
src/share/vm/gc/g1/concurrentMark.cpp
Print this page
*** 56,140 ****
#include "runtime/handles.inline.hpp"
#include "runtime/java.hpp"
#include "runtime/prefetch.inline.hpp"
#include "services/memTracker.hpp"
! // Concurrent marking bit map wrapper
! CMBitMapRO::CMBitMapRO(int shifter) :
! _bm(),
! _shifter(shifter) {
! _bmStartWord = 0;
! _bmWordSize = 0;
! }
!
! HeapWord* CMBitMapRO::getNextMarkedWordAddress(const HeapWord* addr,
! const HeapWord* limit) const {
! // First we must round addr *up* to a possible object boundary.
! addr = (HeapWord*)align_size_up((intptr_t)addr,
! HeapWordSize << _shifter);
! size_t addrOffset = heapWordToOffset(addr);
! if (limit == NULL) {
! limit = _bmStartWord + _bmWordSize;
! }
! size_t limitOffset = heapWordToOffset(limit);
! size_t nextOffset = _bm.get_next_one_offset(addrOffset, limitOffset);
! HeapWord* nextAddr = offsetToHeapWord(nextOffset);
! assert(nextAddr >= addr, "get_next_one postcondition");
! assert(nextAddr == limit || isMarked(nextAddr),
! "get_next_one postcondition");
! return nextAddr;
! }
!
! HeapWord* CMBitMapRO::getNextUnmarkedWordAddress(const HeapWord* addr,
! const HeapWord* limit) const {
! size_t addrOffset = heapWordToOffset(addr);
! if (limit == NULL) {
! limit = _bmStartWord + _bmWordSize;
! }
! size_t limitOffset = heapWordToOffset(limit);
! size_t nextOffset = _bm.get_next_zero_offset(addrOffset, limitOffset);
! HeapWord* nextAddr = offsetToHeapWord(nextOffset);
! assert(nextAddr >= addr, "get_next_one postcondition");
! assert(nextAddr == limit || !isMarked(nextAddr),
! "get_next_one postcondition");
! return nextAddr;
! }
!
! int CMBitMapRO::heapWordDiffToOffsetDiff(size_t diff) const {
! assert((diff & ((1 << _shifter) - 1)) == 0, "argument check");
! return (int) (diff >> _shifter);
! }
!
! #ifndef PRODUCT
! bool CMBitMapRO::covers(MemRegion heap_rs) const {
! // assert(_bm.map() == _virtual_space.low(), "map inconsistency");
! assert(((size_t)_bm.size() * ((size_t)1 << _shifter)) == _bmWordSize,
! "size inconsistency");
! return _bmStartWord == (HeapWord*)(heap_rs.start()) &&
! _bmWordSize == heap_rs.word_size();
! }
! #endif
!
! void CMBitMapRO::print_on_error(outputStream* st, const char* prefix) const {
! _bm.print_on_error(st, prefix);
! }
!
! size_t CMBitMap::compute_size(size_t heap_size) {
! return ReservedSpace::allocation_align_size_up(heap_size / mark_distance());
! }
!
! size_t CMBitMap::mark_distance() {
! return MinObjAlignmentInBytes * BitsPerByte;
! }
!
! void CMBitMap::initialize(MemRegion heap, G1RegionToSpaceMapper* storage) {
! _bmStartWord = heap.start();
! _bmWordSize = heap.word_size();
!
! _bm.set_map((BitMap::bm_word_t*) storage->reserved().start());
! _bm.set_size(_bmWordSize >> _shifter);
storage->set_mapping_changed_listener(&_listener);
}
void CMBitMapMappingChangedListener::on_commit(uint start_region, size_t num_regions, bool zero_filled) {
--- 56,68 ----
#include "runtime/handles.inline.hpp"
#include "runtime/java.hpp"
#include "runtime/prefetch.inline.hpp"
#include "services/memTracker.hpp"
! void G1CMBitMap::initialize(MemRegion heap, G1RegionToSpaceMapper* storage) {
! CMBitMap::initialize(heap, storage->reserved());
storage->set_mapping_changed_listener(&_listener);
}
void CMBitMapMappingChangedListener::on_commit(uint start_region, size_t num_regions, bool zero_filled) {
*** 198,250 ****
SuspendibleThreadSetJoiner sts_join(_suspendible);
G1CollectedHeap::heap()->heap_region_par_iterate(_cl, worker_id, &_hrclaimer, true);
}
};
! void CMBitMap::clearAll() {
G1CollectedHeap* g1h = G1CollectedHeap::heap();
ClearBitmapHRClosure cl(NULL, this, false /* may_yield */);
uint n_workers = g1h->workers()->active_workers();
ParClearNextMarkBitmapTask task(&cl, n_workers, false);
g1h->workers()->run_task(&task);
guarantee(cl.complete(), "Must have completed iteration.");
return;
}
- void CMBitMap::markRange(MemRegion mr) {
- mr.intersection(MemRegion(_bmStartWord, _bmWordSize));
- assert(!mr.is_empty(), "unexpected empty region");
- assert((offsetToHeapWord(heapWordToOffset(mr.end())) ==
- ((HeapWord *) mr.end())),
- "markRange memory region end is not card aligned");
- // convert address range into offset range
- _bm.at_put_range(heapWordToOffset(mr.start()),
- heapWordToOffset(mr.end()), true);
- }
-
- void CMBitMap::clearRange(MemRegion mr) {
- mr.intersection(MemRegion(_bmStartWord, _bmWordSize));
- assert(!mr.is_empty(), "unexpected empty region");
- // convert address range into offset range
- _bm.at_put_range(heapWordToOffset(mr.start()),
- heapWordToOffset(mr.end()), false);
- }
-
- MemRegion CMBitMap::getAndClearMarkedRegion(HeapWord* addr,
- HeapWord* end_addr) {
- HeapWord* start = getNextMarkedWordAddress(addr);
- start = MIN2(start, end_addr);
- HeapWord* end = getNextUnmarkedWordAddress(start);
- end = MIN2(end, end_addr);
- assert(start <= end, "Consistency check");
- MemRegion mr(start, end);
- if (!mr.is_empty()) {
- clearRange(mr);
- }
- return mr;
- }
-
CMMarkStack::CMMarkStack(ConcurrentMark* cm) :
_base(NULL), _cm(cm)
#ifdef ASSERT
, _drain_in_progress(false)
, _drain_in_progress_yields(false)
--- 126,145 ----
SuspendibleThreadSetJoiner sts_join(_suspendible);
G1CollectedHeap::heap()->heap_region_par_iterate(_cl, worker_id, &_hrclaimer, true);
}
};
! void G1CMBitMap::clearAll() {
G1CollectedHeap* g1h = G1CollectedHeap::heap();
ClearBitmapHRClosure cl(NULL, this, false /* may_yield */);
uint n_workers = g1h->workers()->active_workers();
ParClearNextMarkBitmapTask task(&cl, n_workers, false);
g1h->workers()->run_task(&task);
guarantee(cl.complete(), "Must have completed iteration.");
return;
}
CMMarkStack::CMMarkStack(ConcurrentMark* cm) :
_base(NULL), _cm(cm)
#ifdef ASSERT
, _drain_in_progress(false)
, _drain_in_progress_yields(false)
< prev index next >