diff --git a/src/mpmc.rs b/src/mpmc.rs index b652fd0f..99285e02 100644 --- a/src/mpmc.rs +++ b/src/mpmc.rs @@ -481,7 +481,7 @@ unsafe fn dequeue(buffer: *mut Cell, 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( 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 diff --git a/tests/tsan.rs b/tests/tsan.rs index f29b9303..04c392f3 100644 --- a/tests/tsan.rs +++ b/tests/tsan.rs @@ -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; } _ => {}