< 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 >