@@ -447,53 +447,89 @@ fn check_cmp_gt_to_seq() {
447
447
448
448
#[ test]
449
449
fn check_cmp_short_circuit ( ) {
450
+ // We only use a single thread in order to make the short-circuit behavior deterministic.
451
+ let pool = ThreadPoolBuilder :: new ( ) . num_threads ( 1 ) . build ( ) . unwrap ( ) ;
452
+
450
453
let a = vec ! [ 0 ; 1024 ] ;
451
454
let mut b = a. clone ( ) ;
452
455
b[ 42 ] = 1 ;
453
456
454
- let counter = AtomicUsize :: new ( 0 ) ;
455
- let result = a
456
- . par_iter ( )
457
- . inspect ( |_| {
458
- counter. fetch_add ( 1 , Ordering :: SeqCst ) ;
459
- } )
460
- . cmp ( & b) ;
461
- assert ! ( result == :: std:: cmp:: Ordering :: Less ) ;
462
- assert ! ( counter. load( Ordering :: SeqCst ) < a. len( ) ) ; // should not have visited every single one
457
+ pool. install ( || {
458
+ let expected = :: std:: cmp:: Ordering :: Less ;
459
+ assert_eq ! ( a. par_iter( ) . cmp( & b) , expected) ;
460
+
461
+ for len in 1 ..10 {
462
+ let counter = AtomicUsize :: new ( 0 ) ;
463
+ let result = a
464
+ . par_iter ( )
465
+ . with_max_len ( len)
466
+ . inspect ( |_| {
467
+ counter. fetch_add ( 1 , Ordering :: SeqCst ) ;
468
+ } )
469
+ . cmp ( & b) ;
470
+ assert_eq ! ( result, expected) ;
471
+ // should not have visited every single one
472
+ assert ! ( counter. into_inner( ) < a. len( ) ) ;
473
+ }
474
+ } ) ;
463
475
}
464
476
465
477
#[ test]
466
478
fn check_partial_cmp_short_circuit ( ) {
479
+ // We only use a single thread to make the short-circuit behavior deterministic.
480
+ let pool = ThreadPoolBuilder :: new ( ) . num_threads ( 1 ) . build ( ) . unwrap ( ) ;
481
+
467
482
let a = vec ! [ 0 ; 1024 ] ;
468
483
let mut b = a. clone ( ) ;
469
484
b[ 42 ] = 1 ;
470
485
471
- let counter = AtomicUsize :: new ( 0 ) ;
472
- let result = a
473
- . par_iter ( )
474
- . inspect ( |_| {
475
- counter. fetch_add ( 1 , Ordering :: SeqCst ) ;
476
- } )
477
- . partial_cmp ( & b) ;
478
- assert ! ( result == Some ( :: std:: cmp:: Ordering :: Less ) ) ;
479
- assert ! ( counter. load( Ordering :: SeqCst ) < a. len( ) ) ; // should not have visited every single one
486
+ pool. install ( || {
487
+ let expected = Some ( :: std:: cmp:: Ordering :: Less ) ;
488
+ assert_eq ! ( a. par_iter( ) . partial_cmp( & b) , expected) ;
489
+
490
+ for len in 1 ..10 {
491
+ let counter = AtomicUsize :: new ( 0 ) ;
492
+ let result = a
493
+ . par_iter ( )
494
+ . with_max_len ( len)
495
+ . inspect ( |_| {
496
+ counter. fetch_add ( 1 , Ordering :: SeqCst ) ;
497
+ } )
498
+ . partial_cmp ( & b) ;
499
+ assert_eq ! ( result, expected) ;
500
+ // should not have visited every single one
501
+ assert ! ( counter. into_inner( ) < a. len( ) ) ;
502
+ }
503
+ } ) ;
480
504
}
481
505
482
506
#[ test]
483
507
fn check_partial_cmp_nan_short_circuit ( ) {
508
+ // We only use a single thread to make the short-circuit behavior deterministic.
509
+ let pool = ThreadPoolBuilder :: new ( ) . num_threads ( 1 ) . build ( ) . unwrap ( ) ;
510
+
484
511
let a = vec ! [ 0.0 ; 1024 ] ;
485
512
let mut b = a. clone ( ) ;
486
513
b[ 42 ] = f64:: NAN ;
487
514
488
- let counter = AtomicUsize :: new ( 0 ) ;
489
- let result = a
490
- . par_iter ( )
491
- . inspect ( |_| {
492
- counter. fetch_add ( 1 , Ordering :: SeqCst ) ;
493
- } )
494
- . partial_cmp ( & b) ;
495
- assert ! ( result == None ) ;
496
- assert ! ( counter. load( Ordering :: SeqCst ) < a. len( ) ) ; // should not have visited every single one
515
+ pool. install ( || {
516
+ let expected = None ;
517
+ assert_eq ! ( a. par_iter( ) . partial_cmp( & b) , expected) ;
518
+
519
+ for len in 1 ..10 {
520
+ let counter = AtomicUsize :: new ( 0 ) ;
521
+ let result = a
522
+ . par_iter ( )
523
+ . with_max_len ( len)
524
+ . inspect ( |_| {
525
+ counter. fetch_add ( 1 , Ordering :: SeqCst ) ;
526
+ } )
527
+ . partial_cmp ( & b) ;
528
+ assert_eq ! ( result, expected) ;
529
+ // should not have visited every single one
530
+ assert ! ( counter. into_inner( ) < a. len( ) ) ;
531
+ }
532
+ } ) ;
497
533
}
498
534
499
535
#[ test]
0 commit comments