< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp

Print this page
rev 59811 : 8247670: Shenandoah: deadlock during class unloading OOME

*** 35,52 **** #include "memory/resourceArea.hpp" bool ShenandoahBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) { ShenandoahReentrantLock* lock = ShenandoahNMethod::lock_for_nmethod(nm); assert(lock != NULL, "Must be"); ! ShenandoahReentrantLocker locker(lock); if (!is_armed(nm)) { // Some other thread got here first and healed the oops // and disarmed the nmethod. return true; } if (nm->is_unloading()) { // We don't need to take the lock when unlinking nmethods from // the Method, because it is only concurrently unlinked by // the entry barrier, which acquires the per nmethod lock. nm->unlink_from_method(); --- 35,58 ---- #include "memory/resourceArea.hpp" bool ShenandoahBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) { ShenandoahReentrantLock* lock = ShenandoahNMethod::lock_for_nmethod(nm); assert(lock != NULL, "Must be"); ! ShenandoahAbortableNMethodLocker locker(lock); if (!is_armed(nm)) { // Some other thread got here first and healed the oops // and disarmed the nmethod. return true; } + // We may not be able to acquire the lock without potential deadlock if + // we run into evacuation OOM, just return false + if (locker.aborted()) { + return false; + } + if (nm->is_unloading()) { // We don't need to take the lock when unlinking nmethods from // the Method, because it is only concurrently unlinked by // the entry barrier, which acquires the per nmethod lock. nm->unlink_from_method();
< prev index next >