summary refs log tree commit diff stats
path: root/tests/threads/threadex.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/threads/threadex.nim')
-rw-r--r--tests/threads/threadex.nim50
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/threads/threadex.nim b/tests/threads/threadex.nim
new file mode 100644
index 000000000..90119aee7
--- /dev/null
+++ b/tests/threads/threadex.nim
@@ -0,0 +1,50 @@
+discard """
+  disabled: i386
+  outputsub: "Just a simple text for test"
+"""
+
+type
+  TMsgKind = enum
+    mLine, mEof
+  TMsg = object
+    case k: TMsgKind
+    of mEof: discard
+    of mLine: data: string
+
+var
+  producer, consumer: Thread[void]
+  chan: Channel[TMsg]
+  printedLines = 0
+  prodId: int
+  consId: int
+
+proc consume() {.thread.} =
+  consId = getThreadId()
+  while true:
+    var x = recv(chan)
+    if x.k == mEof: break
+    echo x.data
+    atomicInc(printedLines)
+
+proc produce() {.thread.} =
+  prodId = getThreadId()
+  var m: TMsg
+  var input = open("tests/dummy.txt")
+  var line = ""
+  while input.readLine(line):
+    m.data = line
+    chan.send(m)
+  close(input)
+  m = TMsg(k: mEof)
+  chan.send(m)
+
+open(chan)
+createThread[void](consumer, consume)
+createThread[void](producer, produce)
+joinThread(consumer)
+joinThread(producer)
+
+close(chan)
+doAssert prodId != consId
+echo printedLines
+