equal
deleted
inserted
replaced
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 |