summary refs log tree commit diff stats
path: root/tests/parallel/tblocking_channel.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/parallel/tblocking_channel.nim')
-rw-r--r--tests/parallel/tblocking_channel.nim39
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/parallel/tblocking_channel.nim b/tests/parallel/tblocking_channel.nim
new file mode 100644
index 000000000..f3ccd166a
--- /dev/null
+++ b/tests/parallel/tblocking_channel.nim
@@ -0,0 +1,39 @@
+discard """
+output: ""
+disabled: "freebsd" # see #15725
+"""
+
+import threadpool, os
+
+var chan: Channel[int]
+
+chan.open(2)
+chan.send(1)
+chan.send(2)
+doAssert(not chan.trySend(3)) # At this point chan is at max capacity
+
+proc receiver() =
+    doAssert(chan.recv() == 1)
+    doAssert(chan.recv() == 2)
+    doAssert(chan.recv() == 3)
+    doAssert(chan.recv() == 4)
+    doAssert(chan.recv() == 5)
+
+var msgSent = false
+
+proc emitter() =
+    chan.send(3)
+    msgSent = true
+
+spawn emitter()
+# At this point emitter should be stuck in `send`
+sleep(50) # Sleep a bit to ensure that it is still stuck
+doAssert(not msgSent)
+
+spawn receiver()
+sleep(50) # Sleep a bit to let receicer consume the messages
+doAssert(msgSent) # Sender should be unblocked
+
+doAssert(chan.trySend(4))
+chan.send(5)
+sync()