@@ -479,7 +479,7 @@ unsafe fn dequeue<T>(buffer: *mut Cell<T>, dequeue_pos: &AtomicU8, mask: u8) ->
479
479
loop {
480
480
cell = buffer. add ( usize:: from ( pos & mask) ) ;
481
481
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 ) ;
483
483
484
484
if dif == 0 {
485
485
if dequeue_pos
@@ -496,11 +496,7 @@ unsafe fn dequeue<T>(buffer: *mut Cell<T>, dequeue_pos: &AtomicU8, mask: u8) ->
496
496
} else if dif < 0 {
497
497
return None ;
498
498
} 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 ) ;
504
500
}
505
501
}
506
502
@@ -523,7 +519,7 @@ unsafe fn enqueue<T>(
523
519
loop {
524
520
cell = buffer. add ( usize:: from ( pos & mask) ) ;
525
521
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 ) ;
527
523
528
524
if dif == 0 {
529
525
if enqueue_pos
@@ -568,13 +564,26 @@ mod tests {
568
564
}
569
565
570
566
#[ test]
571
- fn blocking ( ) {
567
+ fn drain_at_pos255 ( ) {
572
568
let q = Q2 :: new ( ) ;
573
569
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 ) ) ;
576
583
}
584
+ assert ! ( q. enqueue( 0 ) . is_ok( ) ) ;
585
+ assert ! ( q. enqueue( 0 ) . is_ok( ) ) ;
577
586
// this should not block forever
578
- q . dequeue ( ) ;
587
+ assert ! ( q . enqueue ( 0 ) . is_err ( ) ) ;
579
588
}
580
589
}
0 commit comments