Top


定義場所(file name)

hotspot/src/share/vm/utilities/bitMap.inline.hpp

名前(function name)

inline bool BitMap::par_set_bit(idx_t bit) {

本体部(body)

  {- -------------------------------------------
  (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.