mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
sync: fix rare freeze on select (#7398)
This commit is contained in:
43
vlib/sync/channel_select_4_test.v
Normal file
43
vlib/sync/channel_select_4_test.v
Normal file
@@ -0,0 +1,43 @@
|
||||
fn do_rec_i64(ch chan i64, sumch chan i64) {
|
||||
mut sum := i64(0)
|
||||
for _ in 0 .. 30000 {
|
||||
sum += <-ch
|
||||
}
|
||||
sumch <- sum
|
||||
}
|
||||
|
||||
fn do_send_int(ch chan int) {
|
||||
for i in 0 .. 30000 {
|
||||
ch <- i
|
||||
}
|
||||
}
|
||||
|
||||
fn test_select() {
|
||||
chi := chan int{cap: 10}
|
||||
recch := chan i64{cap: 10}
|
||||
chsum := chan i64{}
|
||||
go do_rec_i64(recch, chsum)
|
||||
go do_send_int(chi)
|
||||
mut sum := i64(0)
|
||||
mut sl := i64(0)
|
||||
for _ in 0 .. 60000 + recch.cap {
|
||||
select {
|
||||
ri := <-chi {
|
||||
sum += ri
|
||||
}
|
||||
recch <- sl {
|
||||
sl++
|
||||
}
|
||||
}
|
||||
}
|
||||
// Use Gauß' formula
|
||||
expected_sum := i64(30000) * (30000 - 1) / 2
|
||||
assert sum == expected_sum
|
||||
|
||||
mut sumrec := <- chsum
|
||||
// Empty receive buffer
|
||||
for _ in 0 .. recch.cap {
|
||||
sumrec += <- recch
|
||||
}
|
||||
assert sumrec == i64(30000 + recch.cap) * (30000 + recch.cap - 1) / 2
|
||||
}
|
||||
Reference in New Issue
Block a user