< prev index next >
src/hotspot/share/runtime/objectMonitor.cpp
Print this page
rev 55936 : [mq]: 8229212.cr0
rev 55937 : 8229212: clear up CHECK_OWNER confusion in objectMonitor.cpp
Reviewed-by: dholmes
*** 1141,1158 ****
guarantee(_recursions == 0, "reenter recursion");
_recursions = recursions;
return;
}
! // Returns true if the specified thread owns the ObjectMonitor. Otherwise
! // returns false and throws IllegalMonitorStateException (IMSE). This
! // function is not called with CHECK because we want the IMSE to be the
! // only exception that is thrown from the call site when false is returned.
! // If an IMSE needs to be thrown, then it takes precedence over any pending
! // exception at the call sites. If true is returned, then we don't throw
! // any exception (pending or otherwise) at the call site.
! bool ObjectMonitor::check_owner_and_throw_IMSE_if_not(Thread* THREAD) {
if (_owner == THREAD) {
return true;
}
if (THREAD->is_lock_owned((address)_owner)) {
_owner = THREAD; // convert from BasicLock addr to Thread addr
--- 1141,1168 ----
guarantee(_recursions == 0, "reenter recursion");
_recursions = recursions;
return;
}
! // Checks that the current THREAD owns this monitor and causes an
! // immediate return if it doesn't. We don't use the CHECK macro
! // because we want the IMSE to be the only exception that is thrown
! // from the call site when false is returned. Any other pending
! // exception is ignored.
! #define CHECK_OWNER() \
! do { \
! if (!check_owner(THREAD)) { \
! assert(HAS_PENDING_EXCEPTION, "expected a pending IMSE here."); \
! return; \
! } \
! } while (false)
!
! // Returns true if the specified thread owns the ObjectMonitor.
! // Otherwise returns false and throws IllegalMonitorStateException
! // (IMSE). If there is a pending exception and the specified thread
! // is not the owner, that exception will be replaced by the IMSE.
! bool ObjectMonitor::check_owner(Thread* THREAD) {
if (_owner == THREAD) {
return true;
}
if (THREAD->is_lock_owned((address)_owner)) {
_owner = THREAD; // convert from BasicLock addr to Thread addr
*** 1188,1201 ****
assert(Self->is_Java_thread(), "Must be Java thread!");
JavaThread *jt = (JavaThread *)THREAD;
assert(InitDone, "Unexpectedly not initialized");
! if (!check_owner_and_throw_IMSE_if_not(THREAD)) {
! assert(HAS_PENDING_EXCEPTION, "expected a pending exception here.");
! return;
! }
EventJavaMonitorWait event;
// check for a pending interrupt
if (interruptible && Thread::is_interrupted(Self, true) && !HAS_PENDING_EXCEPTION) {
--- 1198,1208 ----
assert(Self->is_Java_thread(), "Must be Java thread!");
JavaThread *jt = (JavaThread *)THREAD;
assert(InitDone, "Unexpectedly not initialized");
! CHECK_OWNER(); // Throws IMSE if not owner.
EventJavaMonitorWait event;
// check for a pending interrupt
if (interruptible && Thread::is_interrupted(Self, true) && !HAS_PENDING_EXCEPTION) {
*** 1470,1483 ****
// When the "minimum wait" is set to a small non-zero timeout value
// and the program does not hang whereas it did absent "minimum wait",
// that suggests a lost wakeup bug.
void ObjectMonitor::notify(TRAPS) {
! if (!check_owner_and_throw_IMSE_if_not(THREAD)) {
! assert(HAS_PENDING_EXCEPTION, "expected a pending exception here.");
! return;
! }
if (_WaitSet == NULL) {
return;
}
DTRACE_MONITOR_PROBE(notify, this, object(), THREAD);
INotify(THREAD);
--- 1477,1487 ----
// When the "minimum wait" is set to a small non-zero timeout value
// and the program does not hang whereas it did absent "minimum wait",
// that suggests a lost wakeup bug.
void ObjectMonitor::notify(TRAPS) {
! CHECK_OWNER(); // Throws IMSE if not owner.
if (_WaitSet == NULL) {
return;
}
DTRACE_MONITOR_PROBE(notify, this, object(), THREAD);
INotify(THREAD);
*** 1491,1504 ****
// that in prepend-mode we invert the order of the waiters. Let's say that the
// waitset is "ABCD" and the EntryList is "XYZ". After a notifyAll() in prepend
// mode the waitset will be empty and the EntryList will be "DCBAXYZ".
void ObjectMonitor::notifyAll(TRAPS) {
! if (!check_owner_and_throw_IMSE_if_not(THREAD)) {
! assert(HAS_PENDING_EXCEPTION, "expected a pending exception here.");
! return;
! }
if (_WaitSet == NULL) {
return;
}
DTRACE_MONITOR_PROBE(notifyAll, this, object(), THREAD);
--- 1495,1505 ----
// that in prepend-mode we invert the order of the waiters. Let's say that the
// waitset is "ABCD" and the EntryList is "XYZ". After a notifyAll() in prepend
// mode the waitset will be empty and the EntryList will be "DCBAXYZ".
void ObjectMonitor::notifyAll(TRAPS) {
! CHECK_OWNER(); // Throws IMSE if not owner.
if (_WaitSet == NULL) {
return;
}
DTRACE_MONITOR_PROBE(notifyAll, this, object(), THREAD);
< prev index next >