< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.cpp
Print this page
rev 59438 : 8245823: Shenandoah: inline/optimize ShenandoahEvacOOMScope
*** 1,7 ****
/*
! * Copyright (c) 2018, 2019, Red Hat, Inc. 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.
--- 1,7 ----
/*
! * Copyright (c) 2018, 2020, Red Hat, Inc. 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.
*** 24,36 ****
#include "precompiled.hpp"
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
#include "gc/shenandoah/shenandoahUtils.hpp"
! #include "gc/shenandoah/shenandoahEvacOOMHandler.hpp"
! #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
! #include "runtime/atomic.hpp"
#include "runtime/os.hpp"
#include "runtime/thread.hpp"
const jint ShenandoahEvacOOMHandler::OOM_MARKER_MASK = 0x80000000;
--- 24,34 ----
#include "precompiled.hpp"
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
#include "gc/shenandoah/shenandoahUtils.hpp"
! #include "gc/shenandoah/shenandoahEvacOOMHandler.inline.hpp"
#include "runtime/os.hpp"
#include "runtime/thread.hpp"
const jint ShenandoahEvacOOMHandler::OOM_MARKER_MASK = 0x80000000;
*** 46,70 ****
// the thread-local oom_during_evac flag to indicate that any attempt
// to evacuate should simply return the forwarding pointer instead (which is safe now).
ShenandoahThreadLocalData::set_oom_during_evac(Thread::current(), true);
}
! void ShenandoahEvacOOMHandler::enter_evacuation() {
jint threads_in_evac = Atomic::load_acquire(&_threads_in_evac);
- Thread* const thr = Thread::current();
- uint8_t level = ShenandoahThreadLocalData::push_evac_oom_scope(thr);
- if ((threads_in_evac & OOM_MARKER_MASK) != 0) {
- wait_for_no_evac_threads();
- return;
- }
-
- // Nesting case, this thread already registered
- if (level > 0) {
- return;
- }
-
assert(!ShenandoahThreadLocalData::is_oom_during_evac(Thread::current()), "TL oom-during-evac must not be set");
while (true) {
jint other = Atomic::cmpxchg(&_threads_in_evac, threads_in_evac, threads_in_evac + 1);
if (other == threads_in_evac) {
// Success: caller may safely enter evacuation
--- 44,56 ----
// the thread-local oom_during_evac flag to indicate that any attempt
// to evacuate should simply return the forwarding pointer instead (which is safe now).
ShenandoahThreadLocalData::set_oom_during_evac(Thread::current(), true);
}
! void ShenandoahEvacOOMHandler::register_thread_to_protocol(Thread* thr) {
jint threads_in_evac = Atomic::load_acquire(&_threads_in_evac);
assert(!ShenandoahThreadLocalData::is_oom_during_evac(Thread::current()), "TL oom-during-evac must not be set");
while (true) {
jint other = Atomic::cmpxchg(&_threads_in_evac, threads_in_evac, threads_in_evac + 1);
if (other == threads_in_evac) {
// Success: caller may safely enter evacuation
*** 80,97 ****
threads_in_evac = other;
}
}
}
! void ShenandoahEvacOOMHandler::leave_evacuation() {
! Thread* const thr = Thread::current();
! uint8_t level = ShenandoahThreadLocalData::pop_evac_oom_scope(thr);
! // Not top level, just return
! if (level > 1) {
! return;
! }
!
if (!ShenandoahThreadLocalData::is_oom_during_evac(thr)) {
assert((Atomic::load_acquire(&_threads_in_evac) & ~OOM_MARKER_MASK) > 0, "sanity");
// NOTE: It's ok to simply decrement, even with mask set, because unmasked value is positive.
Atomic::dec(&_threads_in_evac);
} else {
--- 66,76 ----
threads_in_evac = other;
}
}
}
! void ShenandoahEvacOOMHandler::unregister_thread_to_protocol(Thread* thr) {
if (!ShenandoahThreadLocalData::is_oom_during_evac(thr)) {
assert((Atomic::load_acquire(&_threads_in_evac) & ~OOM_MARKER_MASK) > 0, "sanity");
// NOTE: It's ok to simply decrement, even with mask set, because unmasked value is positive.
Atomic::dec(&_threads_in_evac);
} else {
*** 124,136 ****
void ShenandoahEvacOOMHandler::clear() {
assert(ShenandoahSafepoint::is_at_shenandoah_safepoint(), "must be at a safepoint");
assert((Atomic::load_acquire(&_threads_in_evac) & ~OOM_MARKER_MASK) == 0, "sanity");
Atomic::release_store_fence(&_threads_in_evac, (jint)0);
}
-
- ShenandoahEvacOOMScope::ShenandoahEvacOOMScope() {
- ShenandoahHeap::heap()->enter_evacuation();
- }
-
- ShenandoahEvacOOMScope::~ShenandoahEvacOOMScope() {
- ShenandoahHeap::heap()->leave_evacuation();
- }
--- 103,107 ----
< prev index next >