< prev index next >

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

Print this page




  55 inline bool BitMap::par_at(idx_t index, atomic_memory_order memory_order) const {
  56   verify_index(index);
  57   assert(memory_order == memory_order_acquire ||
  58          memory_order == memory_order_relaxed,
  59          "unexpected memory ordering");
  60   const volatile bm_word_t* const addr = word_addr(index);
  61   return (load_word_ordered(addr, memory_order) & bit_mask(index)) != 0;
  62 }
  63 
  64 inline bool BitMap::par_set_bit(idx_t bit, atomic_memory_order memory_order) {
  65   verify_index(bit);
  66   volatile bm_word_t* const addr = word_addr(bit);
  67   const bm_word_t mask = bit_mask(bit);
  68   bm_word_t old_val = load_word_ordered(addr, memory_order);
  69 
  70   do {
  71     const bm_word_t new_val = old_val | mask;
  72     if (new_val == old_val) {
  73       return false;     // Someone else beat us to it.
  74     }
  75     const bm_word_t cur_val = Atomic::cmpxchg(new_val, addr, old_val, memory_order);
  76     if (cur_val == old_val) {
  77       return true;      // Success.
  78     }
  79     old_val = cur_val;  // The value changed, try again.
  80   } while (true);
  81 }
  82 
  83 inline bool BitMap::par_clear_bit(idx_t bit, atomic_memory_order memory_order) {
  84   verify_index(bit);
  85   volatile bm_word_t* const addr = word_addr(bit);
  86   const bm_word_t mask = ~bit_mask(bit);
  87   bm_word_t old_val = load_word_ordered(addr, memory_order);
  88 
  89   do {
  90     const bm_word_t new_val = old_val & mask;
  91     if (new_val == old_val) {
  92       return false;     // Someone else beat us to it.
  93     }
  94     const bm_word_t cur_val = Atomic::cmpxchg(new_val, addr, old_val, memory_order);
  95     if (cur_val == old_val) {
  96       return true;      // Success.
  97     }
  98     old_val = cur_val;  // The value changed, try again.
  99   } while (true);
 100 }
 101 
 102 inline void BitMap::set_range(idx_t beg, idx_t end, RangeSizeHint hint) {
 103   if (hint == small_range && end - beg == 1) {
 104     set_bit(beg);
 105   } else {
 106     if (hint == large_range) {
 107       set_large_range(beg, end);
 108     } else {
 109       set_range(beg, end);
 110     }
 111   }
 112 }
 113 
 114 inline void BitMap::clear_range(idx_t beg, idx_t end, RangeSizeHint hint) {




  55 inline bool BitMap::par_at(idx_t index, atomic_memory_order memory_order) const {
  56   verify_index(index);
  57   assert(memory_order == memory_order_acquire ||
  58          memory_order == memory_order_relaxed,
  59          "unexpected memory ordering");
  60   const volatile bm_word_t* const addr = word_addr(index);
  61   return (load_word_ordered(addr, memory_order) & bit_mask(index)) != 0;
  62 }
  63 
  64 inline bool BitMap::par_set_bit(idx_t bit, atomic_memory_order memory_order) {
  65   verify_index(bit);
  66   volatile bm_word_t* const addr = word_addr(bit);
  67   const bm_word_t mask = bit_mask(bit);
  68   bm_word_t old_val = load_word_ordered(addr, memory_order);
  69 
  70   do {
  71     const bm_word_t new_val = old_val | mask;
  72     if (new_val == old_val) {
  73       return false;     // Someone else beat us to it.
  74     }
  75     const bm_word_t cur_val = Atomic::cmpxchg(addr, old_val, new_val, memory_order);
  76     if (cur_val == old_val) {
  77       return true;      // Success.
  78     }
  79     old_val = cur_val;  // The value changed, try again.
  80   } while (true);
  81 }
  82 
  83 inline bool BitMap::par_clear_bit(idx_t bit, atomic_memory_order memory_order) {
  84   verify_index(bit);
  85   volatile bm_word_t* const addr = word_addr(bit);
  86   const bm_word_t mask = ~bit_mask(bit);
  87   bm_word_t old_val = load_word_ordered(addr, memory_order);
  88 
  89   do {
  90     const bm_word_t new_val = old_val & mask;
  91     if (new_val == old_val) {
  92       return false;     // Someone else beat us to it.
  93     }
  94     const bm_word_t cur_val = Atomic::cmpxchg(addr, old_val, new_val, memory_order);
  95     if (cur_val == old_val) {
  96       return true;      // Success.
  97     }
  98     old_val = cur_val;  // The value changed, try again.
  99   } while (true);
 100 }
 101 
 102 inline void BitMap::set_range(idx_t beg, idx_t end, RangeSizeHint hint) {
 103   if (hint == small_range && end - beg == 1) {
 104     set_bit(beg);
 105   } else {
 106     if (hint == large_range) {
 107       set_large_range(beg, end);
 108     } else {
 109       set_range(beg, end);
 110     }
 111   }
 112 }
 113 
 114 inline void BitMap::clear_range(idx_t beg, idx_t end, RangeSizeHint hint) {


< prev index next >