Fix deadlock on sending to full, buffered, closed Chan

This will also keep messages from being sent to closed, buffered
channels in general.
This commit is contained in:
Feoramund
2024-09-09 14:42:50 -04:00
parent 73f5ab473c
commit 026aef69e3
+6 -1
View File
@@ -164,12 +164,17 @@ send_raw :: proc "contextless" (c: ^Raw_Chan, msg_in: rawptr) -> (ok: bool) {
}
if c.queue != nil { // buffered
sync.guard(&c.mutex)
for c.queue.len == c.queue.cap {
for !sync.atomic_load(&c.closed) &&
c.queue.len == c.queue.cap {
sync.atomic_add(&c.w_waiting, 1)
sync.wait(&c.w_cond, &c.mutex)
sync.atomic_sub(&c.w_waiting, 1)
}
if sync.atomic_load(&c.closed) {
return false
}
ok = raw_queue_push(c.queue, msg_in)
if sync.atomic_load(&c.r_waiting) > 0 {
sync.signal(&c.r_cond)