mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
59 lines
1.1 KiB
Nim
59 lines
1.1 KiB
Nim
discard """
|
|
disabled: "true"
|
|
"""
|
|
|
|
import std / [atomics, strutils, sequtils, isolation]
|
|
|
|
import threading / channels
|
|
|
|
type
|
|
BackendMessage* = object
|
|
field*: seq[int]
|
|
|
|
const MESSAGE_COUNT = 100
|
|
|
|
var
|
|
chan1 = newChan[BackendMessage](MESSAGE_COUNT*2)
|
|
chan2 = newChan[BackendMessage](MESSAGE_COUNT*2)
|
|
|
|
#chan1.open()
|
|
#chan2.open()
|
|
|
|
proc routeMessage*(msg: BackendMessage) =
|
|
var m = isolate(msg)
|
|
discard chan2.trySend(m)
|
|
|
|
var
|
|
thr: Thread[void]
|
|
stopToken: Atomic[bool]
|
|
|
|
proc recvMsg() =
|
|
while not stopToken.load(moRelaxed):
|
|
var resp: BackendMessage
|
|
if chan1.tryRecv(resp):
|
|
#if resp.dataAvailable:
|
|
routeMessage(resp)
|
|
echo "child consumes ", formatSize getOccupiedMem()
|
|
|
|
createThread[void](thr, recvMsg)
|
|
|
|
proc main() =
|
|
let msg: BackendMessage = BackendMessage(field: (0..5).toSeq())
|
|
for j in 0..100:
|
|
echo "New iteration"
|
|
|
|
for _ in 1..MESSAGE_COUNT:
|
|
chan1.send(msg)
|
|
echo "After sending"
|
|
|
|
var counter = 0
|
|
while counter < MESSAGE_COUNT:
|
|
let resp = recv(chan2)
|
|
counter.inc
|
|
echo "After receiving ", formatSize getOccupiedMem()
|
|
|
|
stopToken.store true, moRelaxed
|
|
joinThreads(thr)
|
|
|
|
main()
|