< prev index next >
src/share/vm/gc/g1/g1ConcurrentMark.inline.hpp
Print this page
rev 13257 : [mq]: 8184346-cleanup-g1cmbitmap
rev 13259 : [mq]: 8184347-move-g1cmbitmap-into-own-files
rev 13261 : imported patch 8184348-merge-par_mark-and_gray_root
rev 13262 : imported patch 8184348-ashipilev-review
rev 13263 : imported patch 8184348-deal-with-references
*** 31,42 ****
#include "gc/g1/g1ConcurrentMarkObjArrayProcessor.inline.hpp"
#include "gc/g1/suspendibleThreadSet.hpp"
#include "gc/shared/taskqueue.inline.hpp"
#include "utilities/bitMap.inline.hpp"
! inline bool G1ConcurrentMark::par_mark(oop obj) {
! return _nextMarkBitMap->par_mark((HeapWord*)obj);
}
#ifndef PRODUCT
template<typename Fn>
inline void G1CMMarkStack::iterate(Fn fn) const {
--- 31,63 ----
#include "gc/g1/g1ConcurrentMarkObjArrayProcessor.inline.hpp"
#include "gc/g1/suspendibleThreadSet.hpp"
#include "gc/shared/taskqueue.inline.hpp"
#include "utilities/bitMap.inline.hpp"
! inline bool G1ConcurrentMark::mark_in_next_bitmap(oop const obj) {
! HeapRegion* const hr = _g1h->heap_region_containing(obj);
! return mark_in_next_bitmap(hr, obj);
! }
!
! inline bool G1ConcurrentMark::mark_in_next_bitmap(HeapRegion* const hr, oop const obj) {
! assert(hr != NULL, "just checking");
! assert(hr->is_in_reserved(obj),
! "Attempting to mark object at " PTR_FORMAT " that is not contained in the given region %u",
! p2i(obj), hr->hrm_index());
!
! if (hr->obj_allocated_since_next_marking(obj)) {
! return false;
! }
!
! // Some callers may have stale objects to mark above nTAMS after humongous reclaim.
! assert(obj->is_oop(true /* ignore mark word */), "Address " PTR_FORMAT " to mark is not an oop", p2i(obj));
! assert(!hr->is_continues_humongous(),
! "Should not try to mark object " PTR_FORMAT " in Humongous continues region %u above nTAMS " PTR_FORMAT,
! p2i(obj), hr->hrm_index(), p2i(hr->next_top_at_mark_start()));
!
! HeapWord* const obj_addr = (HeapWord*)obj;
! return _nextMarkBitMap->par_mark(obj_addr);
}
#ifndef PRODUCT
template<typename Fn>
inline void G1CMMarkStack::iterate(Fn fn) const {
*** 138,148 ****
obj->oop_iterate(_cm_oop_closure, mr);
return mr.word_size();
}
inline void G1CMTask::make_reference_grey(oop obj) {
! if (_cm->par_mark(obj)) {
// No OrderAccess:store_load() is needed. It is implicit in the
// CAS done in G1CMBitMap::parMark() call in the routine above.
HeapWord* global_finger = _cm->finger();
// We only need to push a newly grey object on the mark
--- 159,172 ----
obj->oop_iterate(_cm_oop_closure, mr);
return mr.word_size();
}
inline void G1CMTask::make_reference_grey(oop obj) {
! if (!_cm->mark_in_next_bitmap(obj)) {
! return;
! }
!
// No OrderAccess:store_load() is needed. It is implicit in the
// CAS done in G1CMBitMap::parMark() call in the routine above.
HeapWord* global_finger = _cm->finger();
// We only need to push a newly grey object on the mark
*** 174,203 ****
process_grey_task_entry<false>(entry);
} else {
push(entry);
}
}
- }
}
inline void G1CMTask::deal_with_reference(oop obj) {
increment_refs_reached();
!
! HeapWord* objAddr = (HeapWord*) obj;
! assert(obj->is_oop_or_null(true /* ignore mark word */), "Expected an oop or NULL at " PTR_FORMAT, p2i(obj));
! if (_g1h->is_in_g1_reserved(objAddr)) {
! assert(obj != NULL, "null check is implicit");
! if (!_nextMarkBitMap->is_marked(objAddr)) {
! // Only get the containing region if the object is not marked on the
! // bitmap (otherwise, it's a waste of time since we won't do
! // anything with it).
! HeapRegion* hr = _g1h->heap_region_containing(obj);
! if (!hr->obj_allocated_since_next_marking(obj)) {
! make_reference_grey(obj);
! }
! }
}
}
inline void G1ConcurrentMark::markPrev(oop p) {
assert(!_prevMarkBitMap->is_marked((HeapWord*) p), "sanity");
_prevMarkBitMap->mark((HeapWord*) p);
--- 198,215 ----
process_grey_task_entry<false>(entry);
} else {
push(entry);
}
}
}
inline void G1CMTask::deal_with_reference(oop obj) {
increment_refs_reached();
! if (obj == NULL) {
! return;
}
+ make_reference_grey(obj);
}
inline void G1ConcurrentMark::markPrev(oop p) {
assert(!_prevMarkBitMap->is_marked((HeapWord*) p), "sanity");
_prevMarkBitMap->mark((HeapWord*) p);
*** 206,235 ****
bool G1ConcurrentMark::isPrevMarked(oop p) const {
assert(p != NULL && p->is_oop(), "expected an oop");
return _prevMarkBitMap->is_marked((HeapWord*)p);
}
- inline void G1ConcurrentMark::grayRoot(oop obj, HeapRegion* hr) {
- assert(obj != NULL, "pre-condition");
- HeapWord* addr = (HeapWord*) obj;
- if (hr == NULL) {
- hr = _g1h->heap_region_containing(addr);
- } else {
- assert(hr->is_in(addr), "pre-condition");
- }
- assert(hr != NULL, "sanity");
- // Given that we're looking for a region that contains an object
- // header it's impossible to get back a HC region.
- assert(!hr->is_continues_humongous(), "sanity");
-
- if (addr < hr->next_top_at_mark_start()) {
- if (!_nextMarkBitMap->is_marked(addr)) {
- par_mark(obj);
- }
- }
- }
-
inline bool G1ConcurrentMark::do_yield_check() {
if (SuspendibleThreadSet::should_yield()) {
SuspendibleThreadSet::yield();
return true;
} else {
--- 218,227 ----
< prev index next >