hotspot/src/share/vm/runtime/park.cpp
void Parker::Release (Parker * p) {
{- -------------------------------------------
(1) 引数が NULL だった場合は, 何もしない(ここでリターン).
---------------------------------------- -}
if (p == NULL) return ;
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
guarantee (p->AssociatedWith != NULL, "invariant") ;
guarantee (p->FreeNext == NULL , "invariant") ;
{- -------------------------------------------
(1) 引数の Parker オブジェクトを FreeList につなぐ.
(他のスレッドが同時に処理していると失敗することもあるので, 成功するまで Atomic::cmpxchg_ptr() を繰り返す)
---------------------------------------- -}
p->AssociatedWith = NULL ;
for (;;) {
// Push p onto FreeList
Parker * List = FreeList ;
p->FreeNext = List ;
if (Atomic::cmpxchg_ptr (p, &FreeList, List) == List) break ;
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.