< prev index next >
src/share/vm/gc/g1/g1ConcurrentMark.cpp
Print this page
*** 439,449 ****
_has_overflown(false),
_concurrent(false),
_has_aborted(false),
_restart_for_overflow(false),
_concurrent_marking_in_progress(false),
! _concurrent_phase_started(false),
// _verbose_level set below
_init_times(),
_remark_times(), _remark_mark_times(), _remark_weak_ref_times(),
--- 439,449 ----
_has_overflown(false),
_concurrent(false),
_has_aborted(false),
_restart_for_overflow(false),
_concurrent_marking_in_progress(false),
! _concurrent_phase_status(ConcPhaseNotStarted),
// _verbose_level set below
_init_times(),
_remark_times(), _remark_mark_times(), _remark_weak_ref_times(),
*** 1006,1027 ****
root_regions()->scan_finished();
}
}
void G1ConcurrentMark::register_concurrent_phase_start(const char* title) {
! assert(!_concurrent_phase_started, "Sanity");
! _concurrent_phase_started = true;
_g1h->gc_timer_cm()->register_gc_concurrent_start(title);
}
! void G1ConcurrentMark::register_concurrent_phase_end() {
! if (_concurrent_phase_started) {
! _concurrent_phase_started = false;
_g1h->gc_timer_cm()->register_gc_concurrent_end();
}
}
void G1ConcurrentMark::markFromRoots() {
// we might be tempted to assert that:
// assert(asynch == !SafepointSynchronize::is_at_safepoint(),
// "inconsistent argument?");
// However that wouldn't be right, because it's possible that
--- 1006,1054 ----
root_regions()->scan_finished();
}
}
void G1ConcurrentMark::register_concurrent_phase_start(const char* title) {
! uint old_val = 0;
! do {
! old_val = Atomic::cmpxchg(ConcPhaseStarted, &_concurrent_phase_status, ConcPhaseNotStarted);
! } while (old_val != ConcPhaseNotStarted);
_g1h->gc_timer_cm()->register_gc_concurrent_start(title);
}
! void G1ConcurrentMark::register_concurrent_phase_end_common(bool end_timer) {
! if (_concurrent_phase_status == ConcPhaseNotStarted) {
! return;
! }
!
! uint old_val = Atomic::cmpxchg(ConcPhaseStopping, &_concurrent_phase_status, ConcPhaseStarted);
! if (old_val == ConcPhaseStarted) {
_g1h->gc_timer_cm()->register_gc_concurrent_end();
+ // If 'end_timer' is true, we came here to end timer which needs concurrent phase ended.
+ // We need to end it before changing the status to 'ConcPhaseNotStarted' to prevent
+ // starting a new concurrent phase by 'ConcurrentMarkThread'.
+ if (end_timer) {
+ _g1h->gc_timer_cm()->register_gc_end();
+ }
+ old_val = Atomic::cmpxchg(ConcPhaseNotStarted, &_concurrent_phase_status, ConcPhaseStopping);
+ assert(old_val == ConcPhaseStopping, "Should not have changed since we entered this scope.");
+ } else {
+ do {
+ // Let other thread finish changing '_concurrent_phase_status' to 'ConcPhaseNotStarted'.
+ os::naked_short_sleep(1);
+ } while (_concurrent_phase_status != ConcPhaseNotStarted);
}
}
+ void G1ConcurrentMark::register_concurrent_phase_end() {
+ register_concurrent_phase_end_common(false);
+ }
+
+ void G1ConcurrentMark::register_concurrent_gc_end() {
+ register_concurrent_phase_end_common(true);
+ }
+
void G1ConcurrentMark::markFromRoots() {
// we might be tempted to assert that:
// assert(asynch == !SafepointSynchronize::is_at_safepoint(),
// "inconsistent argument?");
// However that wouldn't be right, because it's possible that
*** 2603,2615 ****
false, /* new active value */
satb_mq_set.is_active() /* expected_active */);
_g1h->trace_heap_after_concurrent_cycle();
- // Close any open concurrent phase timing
- register_concurrent_phase_end();
-
_g1h->register_concurrent_cycle_end();
}
static void print_ms_time_info(const char* prefix, const char* name,
NumberSeq& ns) {
--- 2630,2639 ----
< prev index next >