Fixed MPMC panic on wrapping sub

This commit is contained in:
Emil Fresk 2021-04-22 20:00:30 +02:00
parent bd32ab8383
commit 241085e970
2 changed files with 4 additions and 2 deletions

View File

@ -481,7 +481,7 @@ unsafe fn dequeue<T>(buffer: *mut Cell<T>, dequeue_pos: &AtomicU8, mask: u8) ->
loop {
cell = buffer.add(usize::from(pos & mask));
let seq = (*cell).sequence.load(Ordering::Acquire);
let dif = (seq as i8) - ((pos.wrapping_add(1)) as i8);
let dif = (seq as i8).wrapping_sub((pos.wrapping_add(1)) as i8);
if dif == 0 {
if dequeue_pos
@ -521,7 +521,7 @@ unsafe fn enqueue<T>(
loop {
cell = buffer.add(usize::from(pos & mask));
let seq = (*cell).sequence.load(Ordering::Acquire);
let dif = (seq as i8) - (pos as i8);
let dif = (seq as i8).wrapping_sub(pos as i8);
if dif == 0 {
if enqueue_pos

View File

@ -131,6 +131,7 @@ fn mpmc_contention() {
for i in 0..(16 * N) {
sum = sum.wrapping_add(i);
println!("enqueue {}", i);
while let Err(_) = Q.enqueue(i) {}
}
@ -146,6 +147,7 @@ fn mpmc_contention() {
match Q.dequeue() {
Some(v) => {
sum = sum.wrapping_add(v);
println!("dequeue {}", v);
break;
}
_ => {}