diff --git a/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp b/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp index 6fc74c53e63..1db2c990b49 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahLock.cpp @@ -33,6 +33,28 @@ #include "runtime/os.inline.hpp" void ShenandoahLock::contended_lock(bool allow_block_for_safepoint) { + if (UseNewCode) { + int c = Atomic::add(&_contenders, 1) - 1; + Thread* thread = Thread::current(); + ResourceMark rm; + + const char* name = thread->is_Java_thread() ? "Java thread" : thread->name(); + + jlong time1 = os::javaTimeNanos(); + contended_lock_real(allow_block_for_safepoint); + jlong time2 = os::javaTimeNanos(); + + c = Atomic::sub(&_contenders, 1); + if (time2 - time1 > 1000) { + log_info(gc)("CONTENDED LOCKING (" PTR_FORMAT ") by %s (" PTR_FORMAT ") took " JLONG_FORMAT " us, %d contenders", + p2i(this), name, p2i(thread), (time2 - time1) / 1000, c); + } + } else { + contended_lock_real(allow_block_for_safepoint); + } +} + +void ShenandoahLock::contended_lock_real(bool allow_block_for_safepoint) { Thread* thread = Thread::current(); if (allow_block_for_safepoint && thread->is_Java_thread()) { contended_lock_internal(JavaThread::cast(thread)); diff --git a/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp b/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp index 4d7eefd460c..1685a404a99 100644 --- a/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp +++ b/src/hotspot/share/gc/shenandoah/shenandoahLock.hpp @@ -39,11 +39,16 @@ class ShenandoahLock { shenandoah_padding(1); Thread* volatile _owner; shenandoah_padding(2); + volatile int _contenders; + shenandoah_padding(3); template void contended_lock_internal(JavaThread* java_thread); + + void contended_lock_real(bool allow_block_for_safepoint); + public: - ShenandoahLock() : _state(unlocked), _owner(nullptr) {}; + ShenandoahLock() : _state(unlocked), _owner(nullptr), _contenders(0) {}; void lock(bool allow_block_for_safepoint) { assert(Atomic::load(&_owner) != Thread::current(), "reentrant locking attempt, would deadlock");