# HG changeset patch # User dholmes # Date 1574138466 18000 # Node ID f37c2dd33031646efcd385b17b4a7209cc60c5b3 # Parent 8ef5473f5ec56acc046dcf9df57404c506ed4c33 8215355: Object monitor deadlock with no threads holding the monitor (using jemalloc 5.1) Reviewed-by: rehn, stuefe, dcubed, sspitsyn diff -r 8ef5473f5ec5 -r f37c2dd33031 agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java --- a/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java Mon Dec 16 11:27:08 2019 -0500 +++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java Mon Nov 18 23:41:06 2019 -0500 @@ -371,14 +371,14 @@ Address stackBase = getStackBase(); // Be robust if (sp == null) return false; - return stackBase.greaterThanOrEqual(a) && sp.lessThanOrEqual(a); + return stackBase.greaterThan(a) && sp.lessThanOrEqual(a); } public boolean isLockOwned(Address a) { Address stackBase = getStackBase(); Address stackLimit = stackBase.addOffsetTo(-getStackSize()); - return stackBase.greaterThanOrEqual(a) && stackLimit.lessThanOrEqual(a); + return stackBase.greaterThan(a) && stackLimit.lessThanOrEqual(a); // FIXME: should traverse MonitorArray/MonitorChunks as in VM } diff -r 8ef5473f5ec5 -r f37c2dd33031 src/share/vm/runtime/thread.cpp --- a/src/share/vm/runtime/thread.cpp Mon Dec 16 11:27:08 2019 -0500 +++ b/src/share/vm/runtime/thread.cpp Mon Nov 18 23:41:06 2019 -0500 @@ -962,7 +962,7 @@ address end = os::current_stack_pointer(); // Allow non Java threads to call this without stack_base if (_stack_base == NULL) return true; - if (stack_base() >= adr && adr >= end) return true; + if (stack_base() > adr && adr >= end) return true; return false; } diff -r 8ef5473f5ec5 -r f37c2dd33031 src/share/vm/runtime/thread.hpp --- a/src/share/vm/runtime/thread.hpp Mon Dec 16 11:27:08 2019 -0500 +++ b/src/share/vm/runtime/thread.hpp Mon Nov 18 23:41:06 2019 -0500 @@ -558,7 +558,7 @@ bool on_local_stack(address adr) const { /* QQQ this has knowledge of direction, ought to be a stack method */ - return (_stack_base >= adr && adr >= (_stack_base - _stack_size)); + return (_stack_base > adr && adr >= (_stack_base - _stack_size)); } uintptr_t self_raw_id() { return _self_raw_id; }