< prev index next >
src/hotspot/share/gc/g1/g1VMOperations.cpp
Print this page
rev 57464 : [mq]: fix
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
@@ -45,10 +45,11 @@
double target_pause_time_ms) :
VM_GC_Operation(gc_count_before, gc_cause),
_target_pause_time_ms(target_pause_time_ms),
_transient_failure(false),
_cycle_already_in_progress(false),
+ _terminating(false),
_gc_succeeded(false)
{}
bool VM_G1TryInitiateConcMark::doit_prologue() {
bool result = VM_GC_Operation::doit_prologue();
@@ -64,11 +65,21 @@
void VM_G1TryInitiateConcMark::doit() {
G1CollectedHeap* g1h = G1CollectedHeap::heap();
GCCauseSetter x(g1h, _gc_cause);
- if (!g1h->policy()->force_initial_mark_if_outside_cycle(_gc_cause)) {
+
+ // Record for handling by caller.
+ _terminating = g1h->_cm_thread->should_terminate();
+
+ if (_terminating && GCCause::is_user_requested_gc(_gc_cause)) {
+ // When terminating, the request to initiate a concurrent cycle will be
+ // ignored by do_collection_pause_at_safepoint; instead it will just do
+ // a young-only or mixed GC (depending on phase). For a user request
+ // there's no point in even doing that much, so done. For some non-user
+ // requests the alternative GC might still be needed.
+ } else if (!g1h->policy()->force_initial_mark_if_outside_cycle(_gc_cause)) {
// Failure to force the next GC pause to be an initial mark indicates
// there is already a concurrent marking cycle in progress. Set flag
// to notify the caller and return immediately.
_cycle_already_in_progress = true;
} else if (!g1h->do_collection_pause_at_safepoint(_target_pause_time_ms)) {
< prev index next >