fix memory ordering in append_vec (#23215)
This commit is contained in:
@ -286,11 +286,11 @@ impl AppendVec {
|
|||||||
// This mutex forces append to be single threaded, but concurrent with reads
|
// This mutex forces append to be single threaded, but concurrent with reads
|
||||||
// See UNSAFE usage in `append_ptr`
|
// See UNSAFE usage in `append_ptr`
|
||||||
let _lock = self.append_lock.lock().unwrap();
|
let _lock = self.append_lock.lock().unwrap();
|
||||||
self.current_len.store(0, Ordering::Relaxed);
|
self.current_len.store(0, Ordering::Release);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn len(&self) -> usize {
|
pub fn len(&self) -> usize {
|
||||||
self.current_len.load(Ordering::Relaxed)
|
self.current_len.load(Ordering::Acquire)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_empty(&self) -> bool {
|
pub fn is_empty(&self) -> bool {
|
||||||
@ -360,7 +360,7 @@ impl AppendVec {
|
|||||||
offset = next_offset;
|
offset = next_offset;
|
||||||
num_accounts += 1;
|
num_accounts += 1;
|
||||||
}
|
}
|
||||||
let aligned_current_len = u64_align!(self.current_len.load(Ordering::Relaxed));
|
let aligned_current_len = u64_align!(self.current_len.load(Ordering::Acquire));
|
||||||
|
|
||||||
(offset == aligned_current_len, num_accounts)
|
(offset == aligned_current_len, num_accounts)
|
||||||
}
|
}
|
||||||
@ -419,7 +419,7 @@ impl AppendVec {
|
|||||||
for val in vals {
|
for val in vals {
|
||||||
self.append_ptr(offset, val.0, val.1)
|
self.append_ptr(offset, val.0, val.1)
|
||||||
}
|
}
|
||||||
self.current_len.store(*offset, Ordering::Relaxed);
|
self.current_len.store(*offset, Ordering::Release);
|
||||||
Some(pos)
|
Some(pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user