Skip to content

Commit 8c2fd3b

Browse files
authored
Merge pull request #144 from debug-ito/mpmc-i8-dif
mpmc: use i8 to calculate dif to deal with u8 wrapping
2 parents 11c9bd3 + 4e28259 commit 8c2fd3b

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

src/mpmc.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ unsafe fn dequeue<T>(buffer: *mut Cell<T>, dequeue_pos: &AtomicU8, mask: u8) ->
479479
loop {
480480
cell = buffer.add(usize::from(pos & mask));
481481
let seq = (*cell).sequence.load(Ordering::Acquire);
482-
let dif = i16::from(seq) - i16::from(pos.wrapping_add(1));
482+
let dif = (seq as i8) - ((pos.wrapping_add(1)) as i8);
483483

484484
if dif == 0 {
485485
if dequeue_pos
@@ -496,11 +496,7 @@ unsafe fn dequeue<T>(buffer: *mut Cell<T>, dequeue_pos: &AtomicU8, mask: u8) ->
496496
} else if dif < 0 {
497497
return None;
498498
} else {
499-
if pos == 255 && dif == 255 {
500-
return None;
501-
} else {
502-
pos = dequeue_pos.load(Ordering::Relaxed);
503-
}
499+
pos = dequeue_pos.load(Ordering::Relaxed);
504500
}
505501
}
506502

@@ -523,7 +519,7 @@ unsafe fn enqueue<T>(
523519
loop {
524520
cell = buffer.add(usize::from(pos & mask));
525521
let seq = (*cell).sequence.load(Ordering::Acquire);
526-
let dif = i16::from(seq) - i16::from(pos);
522+
let dif = (seq as i8) - (pos as i8);
527523

528524
if dif == 0 {
529525
if enqueue_pos
@@ -568,13 +564,26 @@ mod tests {
568564
}
569565

570566
#[test]
571-
fn blocking() {
567+
fn drain_at_pos255() {
572568
let q = Q2::new();
573569
for _ in 0..255 {
574-
q.enqueue(0).unwrap();
575-
q.dequeue();
570+
assert!(q.enqueue(0).is_ok());
571+
assert_eq!(q.dequeue(), Some(0));
572+
}
573+
// this should not block forever
574+
assert_eq!(q.dequeue(), None);
575+
}
576+
577+
#[test]
578+
fn full_at_wrapped_pos0() {
579+
let q = Q2::new();
580+
for _ in 0..254 {
581+
assert!(q.enqueue(0).is_ok());
582+
assert_eq!(q.dequeue(), Some(0));
576583
}
584+
assert!(q.enqueue(0).is_ok());
585+
assert!(q.enqueue(0).is_ok());
577586
// this should not block forever
578-
q.dequeue();
587+
assert!(q.enqueue(0).is_err());
579588
}
580589
}

0 commit comments

Comments
 (0)