Sfoglia il codice sorgente

Fix deadlock on sending to full, buffered, closed `Chan`

This will also keep messages from being sent to closed, buffered
channels in general.
Feoramund 1 anno fa
parent
commit
026aef69e3
1 ha cambiato i file con 6 aggiunte e 1 eliminazioni
  1. 6 1
      core/sync/chan/chan.odin

+ 6 - 1
core/sync/chan/chan.odin

@@ -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)