jdk
1/*
2* Copyright (c) 2019, 2022, Red Hat, Inc. All rights reserved.
3* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*
5* This code is free software; you can redistribute it and/or modify it
6* under the terms of the GNU General Public License version 2 only, as
7* published by the Free Software Foundation.
8*
9* This code is distributed in the hope that it will be useful, but WITHOUT
10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12* version 2 for more details (a copy is included in the LICENSE file that
13* accompanied this code).
14*
15* You should have received a copy of the GNU General Public License version
16* 2 along with this work; if not, write to the Free Software Foundation,
17* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18*
19* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20* or visit www.oracle.com if you need additional information or have any
21* questions.
22*
23*/
24
25#include "precompiled.hpp"26
27#include "gc/shenandoah/shenandoahBarrierSetNMethod.hpp"28#include "gc/shenandoah/shenandoahClosures.inline.hpp"29#include "gc/shenandoah/shenandoahCodeRoots.hpp"30#include "gc/shenandoah/shenandoahHeap.inline.hpp"31#include "gc/shenandoah/shenandoahLock.hpp"32#include "gc/shenandoah/shenandoahNMethod.inline.hpp"33#include "gc/shenandoah/shenandoahThreadLocalData.hpp"34#include "memory/iterator.hpp"35#include "memory/resourceArea.hpp"36#include "runtime/threadWXSetters.inline.hpp"37
38bool ShenandoahBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {39if (!is_armed(nm)) {40// Some other thread got here first and healed the oops41// and disarmed the nmethod. No need to continue.42return true;43}44
45ShenandoahReentrantLock* lock = ShenandoahNMethod::lock_for_nmethod(nm);46assert(lock != nullptr, "Must be");47ShenandoahReentrantLocker locker(lock);48
49if (!is_armed(nm)) {50// Some other thread managed to complete while we were51// waiting for lock. No need to continue.52return true;53}54
55MACOS_AARCH64_ONLY(ThreadWXEnable wx(WXWrite, Thread::current());)56
57if (nm->is_unloading()) {58// We don't need to take the lock when unlinking nmethods from59// the Method, because it is only concurrently unlinked by60// the entry barrier, which acquires the per nmethod lock.61nm->unlink_from_method();62
63// We can end up calling nmethods that are unloading64// since we clear compiled ICs lazily. Returning false65// will re-resovle the call and update the compiled IC.66return false;67}68
69// Heal oops70ShenandoahNMethod::heal_nmethod(nm);71
72// CodeCache unloading support73nm->mark_as_maybe_on_stack();74
75// Disarm76ShenandoahNMethod::disarm_nmethod(nm);77return true;78}
79