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) { |