mirror of
https://github.com/rust-embedded/heapless.git
synced 2025-09-27 20:40:32 +00:00
Fixed MPMC panic on wrapping sub
This commit is contained in:
parent
bd32ab8383
commit
241085e970
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user