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
|