32 verify_index(bit);
33 *word_addr(bit) |= bit_mask(bit);
34 }
35
36 inline void BitMap::clear_bit(idx_t bit) {
37 verify_index(bit);
38 *word_addr(bit) &= ~bit_mask(bit);
39 }
40
41 inline bool BitMap::par_set_bit(idx_t bit) {
42 verify_index(bit);
43 volatile bm_word_t* const addr = word_addr(bit);
44 const bm_word_t mask = bit_mask(bit);
45 bm_word_t old_val = *addr;
46
47 do {
48 const bm_word_t new_val = old_val | mask;
49 if (new_val == old_val) {
50 return false; // Someone else beat us to it.
51 }
52 const bm_word_t cur_val = (bm_word_t) Atomic::cmpxchg_ptr((void*) new_val,
53 (volatile void*) addr,
54 (void*) old_val);
55 if (cur_val == old_val) {
56 return true; // Success.
57 }
58 old_val = cur_val; // The value changed, try again.
59 } while (true);
60 }
61
62 inline bool BitMap::par_clear_bit(idx_t bit) {
63 verify_index(bit);
64 volatile bm_word_t* const addr = word_addr(bit);
65 const bm_word_t mask = ~bit_mask(bit);
66 bm_word_t old_val = *addr;
67
68 do {
69 const bm_word_t new_val = old_val & mask;
70 if (new_val == old_val) {
71 return false; // Someone else beat us to it.
72 }
73 const bm_word_t cur_val = (bm_word_t) Atomic::cmpxchg_ptr((void*) new_val,
74 (volatile void*) addr,
75 (void*) old_val);
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 void BitMap::set_range(idx_t beg, idx_t end, RangeSizeHint hint) {
84 if (hint == small_range && end - beg == 1) {
85 set_bit(beg);
86 } else {
87 if (hint == large_range) {
88 set_large_range(beg, end);
89 } else {
90 set_range(beg, end);
91 }
92 }
93 }
94
95 inline void BitMap::clear_range(idx_t beg, idx_t end, RangeSizeHint hint) {
|
32 verify_index(bit);
33 *word_addr(bit) |= bit_mask(bit);
34 }
35
36 inline void BitMap::clear_bit(idx_t bit) {
37 verify_index(bit);
38 *word_addr(bit) &= ~bit_mask(bit);
39 }
40
41 inline bool BitMap::par_set_bit(idx_t bit) {
42 verify_index(bit);
43 volatile bm_word_t* const addr = word_addr(bit);
44 const bm_word_t mask = bit_mask(bit);
45 bm_word_t old_val = *addr;
46
47 do {
48 const bm_word_t new_val = old_val | mask;
49 if (new_val == old_val) {
50 return false; // Someone else beat us to it.
51 }
52 const bm_word_t cur_val = Atomic::cmpxchg(new_val, addr, old_val);
53 if (cur_val == old_val) {
54 return true; // Success.
55 }
56 old_val = cur_val; // The value changed, try again.
57 } while (true);
58 }
59
60 inline bool BitMap::par_clear_bit(idx_t bit) {
61 verify_index(bit);
62 volatile bm_word_t* const addr = word_addr(bit);
63 const bm_word_t mask = ~bit_mask(bit);
64 bm_word_t old_val = *addr;
65
66 do {
67 const bm_word_t new_val = old_val & mask;
68 if (new_val == old_val) {
69 return false; // Someone else beat us to it.
70 }
71 const bm_word_t cur_val = Atomic::cmpxchg(new_val, addr, old_val);
72 if (cur_val == old_val) {
73 return true; // Success.
74 }
75 old_val = cur_val; // The value changed, try again.
76 } while (true);
77 }
78
79 inline void BitMap::set_range(idx_t beg, idx_t end, RangeSizeHint hint) {
80 if (hint == small_range && end - beg == 1) {
81 set_bit(beg);
82 } else {
83 if (hint == large_range) {
84 set_large_range(beg, end);
85 } else {
86 set_range(beg, end);
87 }
88 }
89 }
90
91 inline void BitMap::clear_range(idx_t beg, idx_t end, RangeSizeHint hint) {
|