@@ -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