hotspot/src/share/vm/utilities/bitMap.inline.hpp
inline bool BitMap::par_set_bit(idx_t bit) {
{- -------------------------------------------
(1) (verify)
---------------------------------------- -}
verify_index(bit);
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
volatile idx_t* const addr = word_addr(bit);
const idx_t mask = bit_mask(bit);
idx_t old_val = *addr;
{- -------------------------------------------
(1) 1bit だけをアトミックに書き換えたいので,
古い値をロードしてビット演算で or を取った後に Atomic::cmpxchg_ptr() で書き戻す, という処理を行う.
なお, 誰かが既に書き換えてしまっていた場合 (ロードしてきた値の該当箇所に既にbitがたっていた場合) には, 失敗なので false を返す.
Atomic::cmpxchg_ptr() が失敗した場合は, 該当箇所以外の bit が変更されただけかもしれないので, 成否が確定するまで繰り返す.
---------------------------------------- -}
do {
const idx_t new_val = old_val | mask;
if (new_val == old_val) {
return false; // Someone else beat us to it.
}
const idx_t cur_val = (idx_t) Atomic::cmpxchg_ptr((void*) new_val,
(volatile void*) addr,
(void*) old_val);
if (cur_val == old_val) {
return true; // Success.
}
old_val = cur_val; // The value changed, try again.
} while (true);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.