< prev index next >

src/hotspot/share/gc/z/zBitMap.inline.hpp

Print this page




  38 }
  39 
  40 inline bool ZBitMap::par_set_bit_pair_finalizable(idx_t bit, bool& inc_live) {
  41   inc_live = par_set_bit(bit);
  42   return inc_live;
  43 }
  44 
  45 inline bool ZBitMap::par_set_bit_pair_strong(idx_t bit, bool& inc_live) {
  46   verify_index(bit);
  47   volatile bm_word_t* const addr = word_addr(bit);
  48   const bm_word_t pair_mask = bit_mask_pair(bit);
  49   bm_word_t old_val = *addr;
  50 
  51   do {
  52     const bm_word_t new_val = old_val | pair_mask;
  53     if (new_val == old_val) {
  54       // Someone else beat us to it
  55       inc_live = false;
  56       return false;
  57     }
  58     const bm_word_t cur_val = Atomic::cmpxchg(new_val, addr, old_val);
  59     if (cur_val == old_val) {
  60       // Success
  61       const bm_word_t marked_mask = bit_mask(bit);
  62       inc_live = !(old_val & marked_mask);
  63       return true;
  64     }
  65 
  66     // The value changed, retry
  67     old_val = cur_val;
  68   } while (true);
  69 }
  70 
  71 inline bool ZBitMap::par_set_bit_pair(idx_t bit, bool finalizable, bool& inc_live) {
  72   if (finalizable) {
  73     return par_set_bit_pair_finalizable(bit, inc_live);
  74   } else {
  75     return par_set_bit_pair_strong(bit, inc_live);
  76   }
  77 }
  78 


  38 }
  39 
  40 inline bool ZBitMap::par_set_bit_pair_finalizable(idx_t bit, bool& inc_live) {
  41   inc_live = par_set_bit(bit);
  42   return inc_live;
  43 }
  44 
  45 inline bool ZBitMap::par_set_bit_pair_strong(idx_t bit, bool& inc_live) {
  46   verify_index(bit);
  47   volatile bm_word_t* const addr = word_addr(bit);
  48   const bm_word_t pair_mask = bit_mask_pair(bit);
  49   bm_word_t old_val = *addr;
  50 
  51   do {
  52     const bm_word_t new_val = old_val | pair_mask;
  53     if (new_val == old_val) {
  54       // Someone else beat us to it
  55       inc_live = false;
  56       return false;
  57     }
  58     const bm_word_t cur_val = Atomic::cmpxchg(addr, old_val, new_val);
  59     if (cur_val == old_val) {
  60       // Success
  61       const bm_word_t marked_mask = bit_mask(bit);
  62       inc_live = !(old_val & marked_mask);
  63       return true;
  64     }
  65 
  66     // The value changed, retry
  67     old_val = cur_val;
  68   } while (true);
  69 }
  70 
  71 inline bool ZBitMap::par_set_bit_pair(idx_t bit, bool finalizable, bool& inc_live) {
  72   if (finalizable) {
  73     return par_set_bit_pair_finalizable(bit, inc_live);
  74   } else {
  75     return par_set_bit_pair_strong(bit, inc_live);
  76   }
  77 }
  78 
< prev index next >