src/hotspot/share/runtime/objectMonitor.cpp
changeset 59247 56bf71d64d51
parent 59156 14fa9e70ae71
child 59252 623722a6aeb9
equal deleted inserted replaced
59246:fcad92f425c5 59247:56bf71d64d51
   914   for (;;) {
   914   for (;;) {
   915     assert(THREAD == _owner, "invariant");
   915     assert(THREAD == _owner, "invariant");
   916 
   916 
   917     // release semantics: prior loads and stores from within the critical section
   917     // release semantics: prior loads and stores from within the critical section
   918     // must not float (reorder) past the following store that drops the lock.
   918     // must not float (reorder) past the following store that drops the lock.
   919     OrderAccess::release_store(&_owner, (void*)NULL);   // drop the lock
   919     Atomic::release_store(&_owner, (void*)NULL);   // drop the lock
   920     OrderAccess::storeload();                        // See if we need to wake a successor
   920     OrderAccess::storeload();                      // See if we need to wake a successor
   921     if ((intptr_t(_EntryList)|intptr_t(_cxq)) == 0 || _succ != NULL) {
   921     if ((intptr_t(_EntryList)|intptr_t(_cxq)) == 0 || _succ != NULL) {
   922       return;
   922       return;
   923     }
   923     }
   924     // Other threads are blocked trying to acquire the lock.
   924     // Other threads are blocked trying to acquire the lock.
   925 
   925 
  1090   // The thread associated with Wakee may have grabbed the lock and "Wakee" may be
  1090   // The thread associated with Wakee may have grabbed the lock and "Wakee" may be
  1091   // out-of-scope (non-extant).
  1091   // out-of-scope (non-extant).
  1092   Wakee  = NULL;
  1092   Wakee  = NULL;
  1093 
  1093 
  1094   // Drop the lock
  1094   // Drop the lock
  1095   OrderAccess::release_store(&_owner, (void*)NULL);
  1095   Atomic::release_store(&_owner, (void*)NULL);
  1096   OrderAccess::fence();                               // ST _owner vs LD in unpark()
  1096   OrderAccess::fence();                               // ST _owner vs LD in unpark()
  1097 
  1097 
  1098   DTRACE_MONITOR_PROBE(contended__exit, this, object(), Self);
  1098   DTRACE_MONITOR_PROBE(contended__exit, this, object(), Self);
  1099   Trigger->unpark();
  1099   Trigger->unpark();
  1100 
  1100