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