hotspot/src/os/linux/vm/os_linux.cpp
void Parker::unpark() {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
int s, status ;
{- -------------------------------------------
(1) _counter の値を 1 に変更する.
(なお, この変更処理は pthread_mutex_lock() で _mutex を取得して排他した状態で行う)
もし, 変更前の _counter の値が 0 であれば,
(park() で寝ているスレッドがいるということなので)
pthread_cond_signal() でスレッドの起床処理を行う.
(なお, WorkAroundNPTLTimedWaitHang オプションが指定されている場合は,
中途半端な cond_var を見てしまわないよう,
pthread_cond_signal() の呼び出しについても critical section 内で行う.)
---------------------------------------- -}
status = pthread_mutex_lock(_mutex);
assert (status == 0, "invariant") ;
s = _counter;
_counter = 1;
if (s < 1) {
if (WorkAroundNPTLTimedWaitHang) {
status = pthread_cond_signal (_cond) ;
assert (status == 0, "invariant") ;
status = pthread_mutex_unlock(_mutex);
assert (status == 0, "invariant") ;
} else {
status = pthread_mutex_unlock(_mutex);
assert (status == 0, "invariant") ;
status = pthread_cond_signal (_cond) ;
assert (status == 0, "invariant") ;
}
} else {
pthread_mutex_unlock(_mutex);
assert (status == 0, "invariant") ;
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.