v / vlib / sync
Raw file | 61 loc (56 sloc) | 1.04 KB | Latest commit hash e81e0ac70
1fn do_rec_i64(ch chan i64, sumch chan i64) {
2 mut sum := i64(0)
3 for _ in 0 .. 10000 {
4 sum += <-ch
5 }
6 sumch <- sum
7}
8
9fn do_send_int(ch chan int) {
10 for i in 0 .. 10000 {
11 ch <- i
12 }
13}
14
15fn do_send_int2(ch chan int) {
16 for i in 10000 .. 20000 {
17 ch <- i
18 }
19}
20
21fn do_send_int3(ch chan int) {
22 for i in 20000 .. 30000 {
23 ch <- i
24 }
25}
26
27fn test_select() {
28 chi := chan int{cap: 10}
29 recch := chan i64{cap: 10}
30 chsum := chan i64{}
31 spawn do_rec_i64(recch, chsum)
32 spawn do_rec_i64(recch, chsum)
33 spawn do_rec_i64(recch, chsum)
34 spawn do_send_int(chi)
35 spawn do_send_int2(chi)
36 spawn do_send_int3(chi)
37 mut sum := i64(0)
38 mut sl := i64(0)
39 for _ in 0 .. 60000 + recch.cap {
40 select {
41 ri := <-chi {
42 sum += ri
43 }
44 recch <- sl {
45 sl++
46 }
47 }
48 }
49 // Use Gauß' formula
50 expected_sum := i64(30000) * (30000 - 1) / 2
51 assert sum == expected_sum
52
53 mut sumrec := <-chsum
54 sumrec += <-chsum
55 sumrec += <-chsum
56 // Empty receive buffer
57 for _ in 0 .. recch.cap {
58 sumrec += <-recch
59 }
60 assert sumrec == i64(30000 + recch.cap) * (30000 + recch.cap - 1) / 2
61}