< prev index next >
src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp
Print this page
rev 8039 : [mq]: simplify
*** 257,274 ****
_local_max_size = tmp_size;
}
++_local_pushes );
}
! // This determines whether the method below will check both the local
! // and global fingers when determining whether to push on the stack a
! // gray object (value 1) or whether it will only check the global one
! // (value 0). The tradeoffs are that the former will be a bit more
! // accurate and possibly push less on the stack, but it might also be
! // a little bit slower.
!
! #define _CHECK_BOTH_FINGERS_ 1
inline void CMTask::deal_with_reference(oop obj) {
if (_cm->verbose_high()) {
gclog_or_tty->print_cr("[%u] we're dealing with reference = "PTR_FORMAT,
_worker_id, p2i((void*) obj));
--- 257,277 ----
_local_max_size = tmp_size;
}
++_local_pushes );
}
! inline void CMTask::deal_with_reference_below_finger(
! oop obj, HeapWord* finger, bool is_global_finger)
! {
! if (_cm->verbose_high()) {
! gclog_or_tty->print_cr(
! "[%u] below the %s finger (" PTR_FORMAT ") pushing " PTR_FORMAT,
! _worker_id, (is_global_finger ? "global" : "local"),
! p2i(finger), p2i((void*)obj));
! }
! push(obj);
! }
inline void CMTask::deal_with_reference(oop obj) {
if (_cm->verbose_high()) {
gclog_or_tty->print_cr("[%u] we're dealing with reference = "PTR_FORMAT,
_worker_id, p2i((void*) obj));
*** 295,348 ****
if (_cm->par_mark_and_count(obj, hr, _marked_bytes_array, _card_bm)) {
// No OrderAccess:store_load() is needed. It is implicit in the
// CAS done in CMBitMap::parMark() call in the routine above.
HeapWord* global_finger = _cm->finger();
! #if _CHECK_BOTH_FINGERS_
! // we will check both the local and global fingers
!
! if (_finger != NULL && objAddr < _finger) {
! if (_cm->verbose_high()) {
! gclog_or_tty->print_cr("[%u] below the local finger ("PTR_FORMAT"), "
! "pushing it", _worker_id, p2i(_finger));
! }
! push(obj);
! } else if (_curr_region != NULL && objAddr < _region_limit) {
! // do nothing
! } else if (objAddr < global_finger) {
// Notice that the global finger might be moving forward
// concurrently. This is not a problem. In the worst case, we
// mark the object while it is above the global finger and, by
// the time we read the global finger, it has moved forward
// passed this object. In this case, the object will probably
// be visited when a task is scanning the region and will also
// be pushed on the stack. So, some duplicate work, but no
// correctness problems.
-
- if (_cm->verbose_high()) {
- gclog_or_tty->print_cr("[%u] below the global finger "
- "("PTR_FORMAT"), pushing it",
- _worker_id, p2i(global_finger));
- }
- push(obj);
- } else {
- // do nothing
- }
- #else // _CHECK_BOTH_FINGERS_
- // we will only check the global finger
-
if (objAddr < global_finger) {
! // see long comment above
!
! if (_cm->verbose_high()) {
! gclog_or_tty->print_cr("[%u] below the global finger "
! "("PTR_FORMAT"), pushing it",
! _worker_id, p2i(global_finger));
! }
! push(obj);
}
- #endif // _CHECK_BOTH_FINGERS_
}
}
}
}
}
--- 298,343 ----
if (_cm->par_mark_and_count(obj, hr, _marked_bytes_array, _card_bm)) {
// No OrderAccess:store_load() is needed. It is implicit in the
// CAS done in CMBitMap::parMark() call in the routine above.
HeapWord* global_finger = _cm->finger();
! // If we have a current region, check against it first to
! // decide whether to push a freshly grey object on the mark
! // stack or leave it to the mark bit processor. The
! // tradeoff vs only checking the global finger is that the
! // local check will be a bit more accurate and possibly push
! // less on the stack, but might also be a little bit slower.
! if (_finger != NULL) {
! // We have a current region.
! assert(_curr_region != NULL, "invariant");
! assert(_region_limit != NULL, "invariant");
! // If object is before the local finger, push it onto the
! // mark stack. If it's between the local finger and the
! // end of the region, leave it to mark bit processing to
! // take care of. Otherwise, check against the global
! // finger.
! if (objAddr < _finger) {
! deal_with_reference_below_finger(obj, _finger, false);
! return;
! } else if (objAddr < _region_limit) {
! return;
! }
! }
! // No current region, or object is after the current region.
! // Push onto mark stack if below global finger.
! //
// Notice that the global finger might be moving forward
// concurrently. This is not a problem. In the worst case, we
// mark the object while it is above the global finger and, by
// the time we read the global finger, it has moved forward
// passed this object. In this case, the object will probably
// be visited when a task is scanning the region and will also
// be pushed on the stack. So, some duplicate work, but no
// correctness problems.
if (objAddr < global_finger) {
! deal_with_reference_below_finger(obj, global_finger, true);
}
}
}
}
}
}
< prev index next >