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 { loop {
cell = buffer.add(usize::from(pos & mask)); cell = buffer.add(usize::from(pos & mask));
let seq = (*cell).sequence.load(Ordering::Acquire); 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 dif == 0 {
if dequeue_pos if dequeue_pos
@ -521,7 +521,7 @@ unsafe fn enqueue<T>(
loop { loop {
cell = buffer.add(usize::from(pos & mask)); cell = buffer.add(usize::from(pos & mask));
let seq = (*cell).sequence.load(Ordering::Acquire); 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 dif == 0 {
if enqueue_pos if enqueue_pos

View File

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