sync: fix `chan.close()` while a sending thread is waiting (#9654)

pull/9657/head
Uwe Krüger 2021-04-09 22:40:35 +02:00 committed by GitHub
parent 062ee4356d
commit bf9fe659a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 1 deletions

View File

@ -1,4 +1,4 @@
import sync
import time
fn do_rec(ch chan int, resch chan i64) {
mut sum := i64(0)
@ -71,3 +71,38 @@ fn test_channel_close_unbuffered() {
sum += <-resch
assert sum == i64(8000) * (8000 - 1) / 2
}
fn test_channel_send_close_buffered() {
ch := chan int{cap: 1}
t := go fn (ch chan int) {
ch <- 31
mut x := 45
ch <- 17 or {
x = -133
}
assert x == -133
}(ch)
time.sleep(100 * time.millisecond)
ch.close()
mut r := <-ch
r = <-ch or { 23 }
assert r == 23
t.wait()
}
fn test_channel_send_close_unbuffered() {
time.sleep(1 * time.second)
ch := chan int{}
t := go fn (ch chan int) {
mut x := 31
ch <- 177 or {
x = -71
}
assert x == -71
}(ch)
time.sleep(100 * time.millisecond)
ch.close()
r := <-ch or { 238 }
assert r == 238
t.wait()
}

View File

@ -165,6 +165,9 @@ pub fn (mut ch Channel) close() {
}
C.atomic_store_u16(&ch.write_sub_mtx, u16(0))
ch.writesem.post()
if ch.cap == 0 {
C.atomic_store_ptr(&ch.read_adr, voidptr(0))
}
ch.writesem_im.post()
}