Mon, 18 Nov 2019 23:41:06 -0500
8215355: Object monitor deadlock with no threads holding the monitor (using jemalloc 5.1)
Reviewed-by: rehn, stuefe, dcubed, sspitsyn
1.1 --- a/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java Mon Dec 16 11:27:08 2019 -0500 1.2 +++ b/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java Mon Nov 18 23:41:06 2019 -0500 1.3 @@ -371,14 +371,14 @@ 1.4 Address stackBase = getStackBase(); 1.5 // Be robust 1.6 if (sp == null) return false; 1.7 - return stackBase.greaterThanOrEqual(a) && sp.lessThanOrEqual(a); 1.8 + return stackBase.greaterThan(a) && sp.lessThanOrEqual(a); 1.9 } 1.10 1.11 public boolean isLockOwned(Address a) { 1.12 Address stackBase = getStackBase(); 1.13 Address stackLimit = stackBase.addOffsetTo(-getStackSize()); 1.14 1.15 - return stackBase.greaterThanOrEqual(a) && stackLimit.lessThanOrEqual(a); 1.16 + return stackBase.greaterThan(a) && stackLimit.lessThanOrEqual(a); 1.17 1.18 // FIXME: should traverse MonitorArray/MonitorChunks as in VM 1.19 }
2.1 --- a/src/share/vm/runtime/thread.cpp Mon Dec 16 11:27:08 2019 -0500 2.2 +++ b/src/share/vm/runtime/thread.cpp Mon Nov 18 23:41:06 2019 -0500 2.3 @@ -962,7 +962,7 @@ 2.4 address end = os::current_stack_pointer(); 2.5 // Allow non Java threads to call this without stack_base 2.6 if (_stack_base == NULL) return true; 2.7 - if (stack_base() >= adr && adr >= end) return true; 2.8 + if (stack_base() > adr && adr >= end) return true; 2.9 2.10 return false; 2.11 }
3.1 --- a/src/share/vm/runtime/thread.hpp Mon Dec 16 11:27:08 2019 -0500 3.2 +++ b/src/share/vm/runtime/thread.hpp Mon Nov 18 23:41:06 2019 -0500 3.3 @@ -558,7 +558,7 @@ 3.4 3.5 bool on_local_stack(address adr) const { 3.6 /* QQQ this has knowledge of direction, ought to be a stack method */ 3.7 - return (_stack_base >= adr && adr >= (_stack_base - _stack_size)); 3.8 + return (_stack_base > adr && adr >= (_stack_base - _stack_size)); 3.9 } 3.10 3.11 uintptr_t self_raw_id() { return _self_raw_id; }