1 //! Tests for channel selection using the `Select` struct.
3 #![allow(clippy::drop_copy)]
8 use std
::time
::{Duration, Instant}
;
10 use crossbeam_channel
::{after, bounded, tick, unbounded, Receiver, Select, TryRecvError}
;
11 use crossbeam_utils
::thread
::scope
;
13 fn ms(ms
: u64) -> Duration
{
14 Duration
::from_millis(ms
)
19 let (s1
, r1
) = unbounded
::<usize>();
20 let (s2
, r2
) = unbounded
::<usize>();
24 let mut sel
= Select
::new();
25 let oper1
= sel
.recv(&r1
);
26 let oper2
= sel
.recv(&r2
);
27 let oper
= sel
.select();
29 i
if i
== oper1
=> assert_eq
!(oper
.recv(&r1
), Ok(1)),
30 i
if i
== oper2
=> panic
!(),
36 let mut sel
= Select
::new();
37 let oper1
= sel
.recv(&r1
);
38 let oper2
= sel
.recv(&r2
);
39 let oper
= sel
.select();
41 i
if i
== oper1
=> panic
!(),
42 i
if i
== oper2
=> assert_eq
!(oper
.recv(&r2
), Ok(2)),
49 let (_s1
, r1
) = unbounded
::<i32>();
50 let (_s2
, r2
) = unbounded
::<i32>();
51 let (_s3
, r3
) = unbounded
::<i32>();
52 let (_s4
, r4
) = unbounded
::<i32>();
53 let (s5
, r5
) = unbounded
::<i32>();
57 let mut sel
= Select
::new();
58 let oper1
= sel
.recv(&r1
);
59 let oper2
= sel
.recv(&r2
);
60 let oper3
= sel
.recv(&r3
);
61 let oper4
= sel
.recv(&r4
);
62 let oper5
= sel
.recv(&r5
);
63 let oper
= sel
.select();
65 i
if i
== oper1
=> panic
!(),
66 i
if i
== oper2
=> panic
!(),
67 i
if i
== oper3
=> panic
!(),
68 i
if i
== oper4
=> panic
!(),
69 i
if i
== oper5
=> assert_eq
!(oper
.recv(&r5
), Ok(5)),
76 let (s1
, r1
) = unbounded
::<i32>();
77 let (s2
, r2
) = unbounded
::<i32>();
82 thread
::sleep(ms(500));
86 let mut sel
= Select
::new();
87 let oper1
= sel
.recv(&r1
);
88 let oper2
= sel
.recv(&r2
);
89 let oper
= sel
.select_timeout(ms(1000));
92 Ok(oper
) => match oper
.index() {
93 i
if i
== oper1
=> assert
!(oper
.recv(&r1
).is_err()),
94 i
if i
== oper2
=> panic
!(),
103 let mut sel
= Select
::new();
104 let oper1
= sel
.recv(&r1
);
105 let oper2
= sel
.recv(&r2
);
106 let oper
= sel
.select_timeout(ms(1000));
109 Ok(oper
) => match oper
.index() {
110 i
if i
== oper1
=> assert
!(oper
.recv(&r1
).is_err()),
111 i
if i
== oper2
=> panic
!(),
118 thread
::sleep(ms(500));
122 let mut sel
= Select
::new();
123 let oper1
= sel
.recv(&r2
);
124 let oper
= sel
.select_timeout(ms(1000));
127 Ok(oper
) => match oper
.index() {
128 i
if i
== oper1
=> assert
!(oper
.recv(&r2
).is_err()),
138 let (s1
, r1
) = unbounded
::<i32>();
139 let (s2
, r2
) = unbounded
::<i32>();
141 let mut sel
= Select
::new();
142 let _oper1
= sel
.recv(&r1
);
143 let _oper2
= sel
.recv(&r2
);
144 let oper
= sel
.try_select();
152 let mut sel
= Select
::new();
153 let oper1
= sel
.recv(&r1
);
154 let oper2
= sel
.recv(&r2
);
155 let oper
= sel
.try_select();
158 Ok(oper
) => match oper
.index() {
159 i
if i
== oper1
=> assert
!(oper
.recv(&r1
).is_err()),
160 i
if i
== oper2
=> panic
!(),
167 let mut sel
= Select
::new();
168 let oper1
= sel
.recv(&r2
);
169 let oper
= sel
.try_select();
172 Ok(oper
) => match oper
.index() {
173 i
if i
== oper1
=> assert_eq
!(oper
.recv(&r2
), Ok(2)),
178 let mut sel
= Select
::new();
179 let _oper1
= sel
.recv(&r2
);
180 let oper
= sel
.try_select();
186 let mut sel
= Select
::new();
187 let oper
= sel
.try_select();
196 let (_s1
, r1
) = unbounded
::<i32>();
197 let (s2
, r2
) = unbounded
::<i32>();
201 thread
::sleep(ms(1500));
205 let mut sel
= Select
::new();
206 let oper1
= sel
.recv(&r1
);
207 let oper2
= sel
.recv(&r2
);
208 let oper
= sel
.select_timeout(ms(1000));
211 Ok(oper
) => match oper
.index() {
212 i
if i
== oper1
=> panic
!(),
213 i
if i
== oper2
=> panic
!(),
218 let mut sel
= Select
::new();
219 let oper1
= sel
.recv(&r1
);
220 let oper2
= sel
.recv(&r2
);
221 let oper
= sel
.select_timeout(ms(1000));
224 Ok(oper
) => match oper
.index() {
225 i
if i
== oper1
=> panic
!(),
226 i
if i
== oper2
=> assert_eq
!(oper
.recv(&r2
), Ok(2)),
234 let (s
, r
) = unbounded
::<i32>();
236 scope
.spawn(move |_
| {
237 thread
::sleep(ms(500));
241 let mut sel
= Select
::new();
242 let oper
= sel
.select_timeout(ms(1000));
245 let mut sel
= Select
::new();
246 let oper1
= sel
.recv(&r
);
247 let oper
= sel
.try_select();
250 Ok(oper
) => match oper
.index() {
251 i
if i
== oper1
=> assert
!(oper
.recv(&r
).is_err()),
256 Ok(_
) => unreachable
!(),
263 fn default_when_disconnected() {
264 let (_
, r
) = unbounded
::<i32>();
266 let mut sel
= Select
::new();
267 let oper1
= sel
.recv(&r
);
268 let oper
= sel
.try_select();
271 Ok(oper
) => match oper
.index() {
272 i
if i
== oper1
=> assert
!(oper
.recv(&r
).is_err()),
277 let (_
, r
) = unbounded
::<i32>();
279 let mut sel
= Select
::new();
280 let oper1
= sel
.recv(&r
);
281 let oper
= sel
.select_timeout(ms(1000));
284 Ok(oper
) => match oper
.index() {
285 i
if i
== oper1
=> assert
!(oper
.recv(&r
).is_err()),
290 let (s
, _
) = bounded
::<i32>(0);
292 let mut sel
= Select
::new();
293 let oper1
= sel
.send(&s
);
294 let oper
= sel
.try_select();
297 Ok(oper
) => match oper
.index() {
298 i
if i
== oper1
=> assert
!(oper
.send(&s
, 0).is_err()),
303 let (s
, _
) = bounded
::<i32>(0);
305 let mut sel
= Select
::new();
306 let oper1
= sel
.send(&s
);
307 let oper
= sel
.select_timeout(ms(1000));
310 Ok(oper
) => match oper
.index() {
311 i
if i
== oper1
=> assert
!(oper
.send(&s
, 0).is_err()),
319 let start
= Instant
::now();
321 let mut sel
= Select
::new();
322 let oper
= sel
.try_select();
323 assert
!(oper
.is_err());
324 let now
= Instant
::now();
325 assert
!(now
- start
<= ms(50));
327 let start
= Instant
::now();
328 let mut sel
= Select
::new();
329 let oper
= sel
.select_timeout(ms(500));
330 assert
!(oper
.is_err());
331 let now
= Instant
::now();
332 assert
!(now
- start
>= ms(450));
333 assert
!(now
- start
<= ms(550));
338 let (s1
, r1
) = bounded
::<i32>(0);
339 let (s2
, r2
) = bounded
::<i32>(0);
343 thread
::sleep(ms(500));
347 let mut sel
= Select
::new();
348 let oper1
= sel
.recv(&r1
);
349 let oper2
= sel
.recv(&r2
);
350 let oper
= sel
.select_timeout(ms(1000));
353 Ok(oper
) => match oper
.index() {
354 i
if i
== oper1
=> panic
!(),
355 i
if i
== oper2
=> assert_eq
!(oper
.recv(&r2
), Ok(2)),
364 thread
::sleep(ms(500));
365 assert_eq
!(r1
.recv().unwrap(), 1);
368 let mut sel
= Select
::new();
369 let oper1
= sel
.send(&s1
);
370 let oper2
= sel
.send(&s2
);
371 let oper
= sel
.select_timeout(ms(1000));
374 Ok(oper
) => match oper
.index() {
375 i
if i
== oper1
=> oper
.send(&s1
, 1).unwrap(),
376 i
if i
== oper2
=> panic
!(),
386 let (s1
, r1
) = bounded(0);
387 let (s2
, r2
) = bounded(0);
391 thread
::sleep(ms(500));
393 assert_eq
!(r2
.recv().unwrap(), 2);
397 let mut sel
= Select
::new();
398 let oper1
= sel
.recv(&r1
);
399 let oper2
= sel
.send(&s2
);
400 let oper
= sel
.select();
402 i
if i
== oper1
=> assert_eq
!(oper
.recv(&r1
), Ok(1)),
403 i
if i
== oper2
=> oper
.send(&s2
, 2).unwrap(),
413 const RUNS
: usize = 20;
416 let (s1
, r1
) = bounded
::<i32>(0);
417 let (s2
, r2
) = bounded
::<i32>(0);
418 let (s_end
, r_end
) = bounded
::<()>(0);
421 scope
.spawn(|_
| loop {
422 let mut done
= false;
424 let mut sel
= Select
::new();
425 let oper1
= sel
.send(&s1
);
426 let oper
= sel
.try_select();
429 Ok(oper
) => match oper
.index() {
431 let _
= oper
.send(&s1
, 1);
441 let mut sel
= Select
::new();
442 let oper1
= sel
.recv(&r_end
);
443 let oper
= sel
.try_select();
446 Ok(oper
) => match oper
.index() {
448 let _
= oper
.recv(&r_end
);
459 scope
.spawn(|_
| loop {
460 if let Ok(x
) = r2
.try_recv() {
465 let mut done
= false;
466 let mut sel
= Select
::new();
467 let oper1
= sel
.recv(&r_end
);
468 let oper
= sel
.try_select();
471 Ok(oper
) => match oper
.index() {
473 let _
= oper
.recv(&r_end
);
485 thread
::sleep(ms(500));
487 let mut sel
= Select
::new();
488 let oper1
= sel
.recv(&r1
);
489 let oper2
= sel
.send(&s2
);
490 let oper
= sel
.select_timeout(ms(1000));
493 Ok(oper
) => match oper
.index() {
494 i
if i
== oper1
=> assert_eq
!(oper
.recv(&r1
), Ok(1)),
495 i
if i
== oper2
=> assert
!(oper
.send(&s2
, 2).is_ok()),
510 let (s1
, r1
) = unbounded
::<i32>();
511 let (_s2
, r2
) = unbounded
::<i32>();
512 let (s3
, r3
) = unbounded
::<()>();
514 scope
.spawn(move |_
| {
517 assert
!(r3
.try_recv().is_err());
522 s3
.send(()).unwrap();
524 let mut sel
= Select
::new();
525 let oper1
= sel
.recv(&r1
);
526 let oper2
= sel
.recv(&r2
);
527 let oper
= sel
.select();
529 i
if i
== oper1
=> drop(oper
.recv(&r1
)),
530 i
if i
== oper2
=> drop(oper
.recv(&r2
)),
534 s3
.send(()).unwrap();
541 let (s1
, r1
) = unbounded
::<()>();
542 let (s2
, r2
) = unbounded
::<()>();
543 let (_s3
, _r3
) = unbounded
::<()>();
546 scope
.spawn(move |_
| {
547 let mut sel
= Select
::new();
548 let oper1
= sel
.recv(&r1
);
549 let oper2
= sel
.recv(&r2
);
550 let oper
= sel
.select();
552 i
if i
== oper1
=> panic
!(),
553 i
if i
== oper2
=> drop(oper
.recv(&r2
)),
558 thread
::sleep(ms(500));
560 s2
.send(()).unwrap();
567 let (s
, r
) = unbounded();
570 let mut sel
= Select
::new();
571 let oper1
= sel
.recv(&r
);
572 let oper
= sel
.select();
574 i
if i
== oper1
=> drop(oper
.recv(&r
)),
581 let (s
, r
) = unbounded();
586 let mut sel
= Select
::new();
587 let oper1
= sel
.recv(&r
);
588 let oper
= sel
.select();
590 i
if i
== oper1
=> assert_eq
!(oper
.recv(&r
), Ok(())),
594 assert_eq
!(r
.try_recv(), Err(TryRecvError
::Disconnected
));
599 let (s
, r
) = unbounded();
605 let mut sel
= Select
::new();
606 let oper1
= sel
.recv(&r
);
607 let oper
= sel
.select();
609 i
if i
== oper1
=> assert
!(oper
.recv(&r
).is_err()),
615 fn duplicate_operations() {
616 let (s
, r
) = unbounded
::<i32>();
617 let hit
= vec
![Cell
::new(false); 4];
619 while hit
.iter().map(|h
| h
.get()).any(|hit
| !hit
) {
620 let mut sel
= Select
::new();
621 let oper0
= sel
.recv(&r
);
622 let oper1
= sel
.recv(&r
);
623 let oper2
= sel
.send(&s
);
624 let oper3
= sel
.send(&s
);
625 let oper
= sel
.select();
628 assert
!(oper
.recv(&r
).is_ok());
632 assert
!(oper
.recv(&r
).is_ok());
636 assert
!(oper
.send(&s
, 0).is_ok());
640 assert
!(oper
.send(&s
, 0).is_ok());
650 let (s
, r
) = unbounded
::<i32>();
652 let mut sel
= Select
::new();
653 let oper1
= sel
.send(&s
);
654 let oper
= sel
.select();
657 assert
!(oper
.send(&s
, 0).is_ok());
659 let mut sel
= Select
::new();
660 let oper1
= sel
.recv(&r
);
661 let oper
= sel
.select();
664 assert_eq
!(oper
.recv(&r
), Ok(0));
666 let mut sel
= Select
::new();
667 let oper1
= sel
.send(&s
);
668 let oper
= sel
.select();
671 assert
!(oper
.send(&s
, 1).is_ok());
673 let mut sel
= Select
::new();
674 let oper1
= sel
.recv(&r
);
675 let oper
= sel
.select();
678 assert_eq
!(oper
.recv(&r
), Ok(1));
696 const COUNT
: usize = 50;
698 const COUNT
: usize = 10_000;
700 let (s1
, r1
) = unbounded();
701 let (s2
, r2
) = bounded(5);
702 let (s3
, r3
) = bounded(100);
717 let mut sel
= Select
::new();
718 let oper1
= sel
.recv(&r1
);
719 let oper2
= sel
.recv(&r2
);
720 let oper
= sel
.select();
722 ix
if ix
== oper1
=> assert_eq
!(oper
.recv(&r1
), Ok(i
)),
723 ix
if ix
== oper2
=> assert_eq
!(oper
.recv(&r2
), Ok(i
)),
727 s3
.send(()).unwrap();
737 const COUNT
: usize = 50;
739 const COUNT
: usize = 10_000;
741 let (s1
, r1
) = bounded(0);
742 let (s2
, r2
) = bounded(0);
743 let (s3
, r3
) = bounded(100);
748 assert_eq
!(r1
.recv().unwrap(), i
);
749 assert_eq
!(r2
.recv().unwrap(), i
);
756 let mut sel
= Select
::new();
757 let oper1
= sel
.send(&s1
);
758 let oper2
= sel
.send(&s2
);
759 let oper
= sel
.select();
761 ix
if ix
== oper1
=> assert
!(oper
.send(&s1
, i
).is_ok()),
762 ix
if ix
== oper2
=> assert
!(oper
.send(&s2
, i
).is_ok()),
766 s3
.send(()).unwrap();
775 const COUNT
: usize = 100;
777 const COUNT
: usize = 10_000;
779 let (s1
, r1
) = bounded(0);
780 let (s2
, r2
) = bounded(0);
781 let (s3
, r3
) = bounded(100);
787 assert_eq
!(r2
.recv().unwrap(), i
);
794 let mut sel
= Select
::new();
795 let oper1
= sel
.recv(&r1
);
796 let oper2
= sel
.send(&s2
);
797 let oper
= sel
.select();
799 ix
if ix
== oper1
=> assert_eq
!(oper
.recv(&r1
), Ok(i
)),
800 ix
if ix
== oper2
=> assert
!(oper
.send(&s2
, i
).is_ok()),
804 s3
.send(()).unwrap();
811 fn stress_timeout_two_threads() {
812 const COUNT
: usize = 20;
814 let (s
, r
) = bounded(2);
820 thread
::sleep(ms(500));
824 let mut sel
= Select
::new();
825 let oper1
= sel
.send(&s
);
826 let oper
= sel
.select_timeout(ms(100));
829 Ok(oper
) => match oper
.index() {
830 ix
if ix
== oper1
=> {
831 assert
!(oper
.send(&s
, i
).is_ok());
844 thread
::sleep(ms(500));
848 let mut sel
= Select
::new();
849 let oper1
= sel
.recv(&r
);
850 let oper
= sel
.select_timeout(ms(100));
853 Ok(oper
) => match oper
.index() {
854 ix
if ix
== oper1
=> {
855 assert_eq
!(oper
.recv(&r
), Ok(i
));
869 fn send_recv_same_channel() {
870 let (s
, r
) = bounded
::<i32>(0);
871 let mut sel
= Select
::new();
872 let oper1
= sel
.send(&s
);
873 let oper2
= sel
.recv(&r
);
874 let oper
= sel
.select_timeout(ms(100));
877 Ok(oper
) => match oper
.index() {
878 ix
if ix
== oper1
=> panic
!(),
879 ix
if ix
== oper2
=> panic
!(),
884 let (s
, r
) = unbounded
::<i32>();
885 let mut sel
= Select
::new();
886 let oper1
= sel
.send(&s
);
887 let oper2
= sel
.recv(&r
);
888 let oper
= sel
.select_timeout(ms(100));
891 Ok(oper
) => match oper
.index() {
892 ix
if ix
== oper1
=> assert
!(oper
.send(&s
, 0).is_ok()),
893 ix
if ix
== oper2
=> panic
!(),
901 const THREADS
: usize = 44;
903 let (s
, r
) = &bounded
::<usize>(0);
906 for i
in 0..THREADS
{
907 scope
.spawn(move |_
| {
908 let mut sel
= Select
::new();
909 let oper1
= sel
.recv(r
);
910 let oper2
= sel
.send(s
);
911 let oper
= sel
.select();
913 ix
if ix
== oper1
=> assert_ne
!(oper
.recv(r
), Ok(i
)),
914 ix
if ix
== oper2
=> assert
!(oper
.send(s
, i
).is_ok()),
922 assert_eq
!(r
.try_recv(), Err(TryRecvError
::Empty
));
926 fn matching_with_leftover() {
927 const THREADS
: usize = 55;
929 let (s
, r
) = &bounded
::<usize>(0);
932 for i
in 0..THREADS
{
933 scope
.spawn(move |_
| {
934 let mut sel
= Select
::new();
935 let oper1
= sel
.recv(r
);
936 let oper2
= sel
.send(s
);
937 let oper
= sel
.select();
939 ix
if ix
== oper1
=> assert_ne
!(oper
.recv(r
), Ok(i
)),
940 ix
if ix
== oper2
=> assert
!(oper
.send(s
, i
).is_ok()),
949 assert_eq
!(r
.try_recv(), Err(TryRecvError
::Empty
));
953 fn channel_through_channel() {
955 const COUNT
: usize = 50;
957 const COUNT
: usize = 1000;
959 type T
= Box
<dyn Any
+ Send
>;
962 let (s
, r
) = bounded
::<T
>(cap
);
965 scope
.spawn(move |_
| {
969 let (new_s
, new_r
) = bounded(cap
);
970 let new_r
: T
= Box
::new(Some(new_r
));
973 let mut sel
= Select
::new();
974 let oper1
= sel
.send(&s
);
975 let oper
= sel
.select();
977 ix
if ix
== oper1
=> assert
!(oper
.send(&s
, new_r
).is_ok()),
986 scope
.spawn(move |_
| {
991 let mut sel
= Select
::new();
992 let oper1
= sel
.recv(&r
);
993 let oper
= sel
.select();
995 ix
if ix
== oper1
=> oper
998 .downcast_mut
::<Option
<Receiver
<T
>>>()
1002 _
=> unreachable
!(),
1014 fn linearizable_try() {
1016 const COUNT
: usize = 50;
1018 const COUNT
: usize = 100_000;
1021 let (start_s
, start_r
) = bounded
::<()>(0);
1022 let (end_s
, end_r
) = bounded
::<()>(0);
1024 let ((s1
, r1
), (s2
, r2
)) = if step
== 0 {
1025 (bounded
::<i32>(1), bounded
::<i32>(1))
1027 (unbounded
::<i32>(), unbounded
::<i32>())
1033 start_s
.send(()).unwrap();
1035 s1
.send(1).unwrap();
1037 let mut sel
= Select
::new();
1038 let oper1
= sel
.recv(&r1
);
1039 let oper2
= sel
.recv(&r2
);
1040 let oper
= sel
.try_select();
1042 Err(_
) => unreachable
!(),
1043 Ok(oper
) => match oper
.index() {
1044 ix
if ix
== oper1
=> assert
!(oper
.recv(&r1
).is_ok()),
1045 ix
if ix
== oper2
=> assert
!(oper
.recv(&r2
).is_ok()),
1046 _
=> unreachable
!(),
1050 end_s
.send(()).unwrap();
1051 let _
= r2
.try_recv();
1056 start_r
.recv().unwrap();
1058 s2
.send(1).unwrap();
1059 let _
= r1
.try_recv();
1061 end_r
.recv().unwrap();
1069 fn linearizable_timeout() {
1071 const COUNT
: usize = 50;
1073 const COUNT
: usize = 100_000;
1076 let (start_s
, start_r
) = bounded
::<()>(0);
1077 let (end_s
, end_r
) = bounded
::<()>(0);
1079 let ((s1
, r1
), (s2
, r2
)) = if step
== 0 {
1080 (bounded
::<i32>(1), bounded
::<i32>(1))
1082 (unbounded
::<i32>(), unbounded
::<i32>())
1088 start_s
.send(()).unwrap();
1090 s1
.send(1).unwrap();
1092 let mut sel
= Select
::new();
1093 let oper1
= sel
.recv(&r1
);
1094 let oper2
= sel
.recv(&r2
);
1095 let oper
= sel
.select_timeout(ms(0));
1097 Err(_
) => unreachable
!(),
1098 Ok(oper
) => match oper
.index() {
1099 ix
if ix
== oper1
=> assert
!(oper
.recv(&r1
).is_ok()),
1100 ix
if ix
== oper2
=> assert
!(oper
.recv(&r2
).is_ok()),
1101 _
=> unreachable
!(),
1105 end_s
.send(()).unwrap();
1106 let _
= r2
.try_recv();
1111 start_r
.recv().unwrap();
1113 s2
.send(1).unwrap();
1114 let _
= r1
.try_recv();
1116 end_r
.recv().unwrap();
1126 const COUNT
: usize = 50;
1128 const COUNT
: usize = 10_000;
1130 let (s1
, r1
) = bounded
::<()>(COUNT
);
1131 let (s2
, r2
) = unbounded
::<()>();
1134 s1
.send(()).unwrap();
1135 s2
.send(()).unwrap();
1138 let hits
= vec
![Cell
::new(0usize
); 4];
1140 let after
= after(ms(0));
1141 let tick
= tick(ms(0));
1143 let mut sel
= Select
::new();
1144 let oper1
= sel
.recv(&r1
);
1145 let oper2
= sel
.recv(&r2
);
1146 let oper3
= sel
.recv(&after
);
1147 let oper4
= sel
.recv(&tick
);
1148 let oper
= sel
.select();
1149 match oper
.index() {
1150 i
if i
== oper1
=> {
1151 oper
.recv(&r1
).unwrap();
1152 hits
[0].set(hits
[0].get() + 1);
1154 i
if i
== oper2
=> {
1155 oper
.recv(&r2
).unwrap();
1156 hits
[1].set(hits
[1].get() + 1);
1158 i
if i
== oper3
=> {
1159 oper
.recv(&after
).unwrap();
1160 hits
[2].set(hits
[2].get() + 1);
1162 i
if i
== oper4
=> {
1163 oper
.recv(&tick
).unwrap();
1164 hits
[3].set(hits
[3].get() + 1);
1166 _
=> unreachable
!(),
1169 assert
!(hits
.iter().all(|x
| x
.get() >= COUNT
/ hits
.len() / 2));
1175 const COUNT
: usize = 50;
1177 const COUNT
: usize = 10_000;
1179 let (s1
, r1
) = unbounded
::<()>();
1180 let (s2
, r2
) = bounded
::<()>(1);
1181 let (s3
, r3
) = bounded
::<()>(0);
1186 let mut sel
= Select
::new();
1187 let mut oper1
= None
;
1188 let mut oper2
= None
;
1190 oper1
= Some(sel
.send(&s1
));
1193 oper2
= Some(sel
.send(&s2
));
1195 let oper3
= sel
.send(&s3
);
1196 let oper
= sel
.select();
1197 match oper
.index() {
1198 i
if Some(i
) == oper1
=> assert
!(oper
.send(&s1
, ()).is_ok()),
1199 i
if Some(i
) == oper2
=> assert
!(oper
.send(&s2
, ()).is_ok()),
1200 i
if i
== oper3
=> assert
!(oper
.send(&s3
, ()).is_ok()),
1201 _
=> unreachable
!(),
1206 let hits
= vec
![Cell
::new(0usize
); 3];
1208 let mut sel
= Select
::new();
1209 let oper1
= sel
.recv(&r1
);
1210 let oper2
= sel
.recv(&r2
);
1211 let oper3
= sel
.recv(&r3
);
1212 let oper
= sel
.select();
1213 match oper
.index() {
1214 i
if i
== oper1
=> {
1215 oper
.recv(&r1
).unwrap();
1216 hits
[0].set(hits
[0].get() + 1);
1218 i
if i
== oper2
=> {
1219 oper
.recv(&r2
).unwrap();
1220 hits
[1].set(hits
[1].get() + 1);
1222 i
if i
== oper3
=> {
1223 oper
.recv(&r3
).unwrap();
1224 hits
[2].set(hits
[2].get() + 1);
1226 _
=> unreachable
!(),
1229 assert
!(hits
.iter().all(|x
| x
.get() >= COUNT
/ hits
.len() / 50));
1235 fn sync_and_clone() {
1236 const THREADS
: usize = 20;
1238 let (s
, r
) = &bounded
::<usize>(0);
1240 let mut sel
= Select
::new();
1241 let oper1
= sel
.recv(r
);
1242 let oper2
= sel
.send(s
);
1246 for i
in 0..THREADS
{
1247 scope
.spawn(move |_
| {
1248 let mut sel
= sel
.clone();
1249 let oper
= sel
.select();
1250 match oper
.index() {
1251 ix
if ix
== oper1
=> assert_ne
!(oper
.recv(r
), Ok(i
)),
1252 ix
if ix
== oper2
=> assert
!(oper
.send(s
, i
).is_ok()),
1253 _
=> unreachable
!(),
1260 assert_eq
!(r
.try_recv(), Err(TryRecvError
::Empty
));
1264 fn send_and_clone() {
1265 const THREADS
: usize = 20;
1267 let (s
, r
) = &bounded
::<usize>(0);
1269 let mut sel
= Select
::new();
1270 let oper1
= sel
.recv(r
);
1271 let oper2
= sel
.send(s
);
1274 for i
in 0..THREADS
{
1275 let mut sel
= sel
.clone();
1276 scope
.spawn(move |_
| {
1277 let oper
= sel
.select();
1278 match oper
.index() {
1279 ix
if ix
== oper1
=> assert_ne
!(oper
.recv(r
), Ok(i
)),
1280 ix
if ix
== oper2
=> assert
!(oper
.send(s
, i
).is_ok()),
1281 _
=> unreachable
!(),
1288 assert_eq
!(r
.try_recv(), Err(TryRecvError
::Empty
));
1294 const COUNT
: usize = 50;
1296 const COUNT
: usize = 10_000;
1298 let (s1
, r1
) = bounded(0);
1299 let (s2
, r2
) = bounded(0);
1300 let (s3
, r3
) = bounded(100);
1305 s1
.send(i
).unwrap();
1306 assert_eq
!(r2
.recv().unwrap(), i
);
1311 let mut sel
= Select
::new();
1312 let oper1
= sel
.recv(&r1
);
1313 let oper2
= sel
.send(&s2
);
1317 let oper
= sel
.select();
1318 match oper
.index() {
1319 ix
if ix
== oper1
=> assert_eq
!(oper
.recv(&r1
), Ok(i
)),
1320 ix
if ix
== oper2
=> assert
!(oper
.send(&s2
, i
).is_ok()),
1321 _
=> unreachable
!(),
1324 s3
.send(()).unwrap();