hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp
int JvmtiRawMonitor::SimpleExit (Thread * Self) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
guarantee (_owner == Self, "invariant") ;
{- -------------------------------------------
(1) _owner フィールドを NULL に書き換えて, ロックを解放する.
(なお書き込みはメモリバリアを張りながら行う. この store の前後で順番が入れ替わるのは禁止)
---------------------------------------- -}
OrderAccess::release_store_ptr (&_owner, NULL) ;
OrderAccess::fence() ;
{- -------------------------------------------
(1) もし _EntryList も誰もいなければ, 何もすることはないので, ここでリターン.
---------------------------------------- -}
if (_EntryList == NULL) return OS_OK ;
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
ObjectWaiter * w ;
{- -------------------------------------------
(1) RawMonitor_lock で排他した状態で, _EntryList から先頭要素を取り出す.
---------------------------------------- -}
RawMonitor_lock->lock_without_safepoint_check() ;
w = _EntryList ;
if (w != NULL) {
_EntryList = w->_next ;
}
RawMonitor_lock->unlock() ;
{- -------------------------------------------
(1) 取り出した先頭要素が NULL でなければ,
TState を ObjectWaiter::TS_RUN に変更し (てメモリバリアも張っ) た後,
os::PlatformEvent::unpark() で起床させる.
---------------------------------------- -}
if (w != NULL) {
guarantee (w ->TState == ObjectWaiter::TS_ENTER, "invariant") ;
ParkEvent * ev = w->_event ;
w->TState = ObjectWaiter::TS_RUN ;
OrderAccess::fence() ;
ev->unpark() ;
}
{- -------------------------------------------
(1) リターン
---------------------------------------- -}
return OS_OK ;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.