mirror of
https://github.com/nim-lang/Nim.git
synced 2026-05-03 12:34:44 +00:00
54
tests/alloc/tmembug.nim
Normal file
54
tests/alloc/tmembug.nim
Normal file
@@ -0,0 +1,54 @@
|
||||
discard """
|
||||
joinable: false
|
||||
"""
|
||||
|
||||
import std / [atomics, strutils, sequtils]
|
||||
|
||||
type
|
||||
BackendMessage* = object
|
||||
field*: seq[int]
|
||||
|
||||
var
|
||||
chan1: Channel[BackendMessage]
|
||||
chan2: Channel[BackendMessage]
|
||||
|
||||
chan1.open()
|
||||
chan2.open()
|
||||
|
||||
proc routeMessage*(msg: BackendMessage) =
|
||||
discard chan2.trySend(msg)
|
||||
|
||||
var
|
||||
recv: Thread[void]
|
||||
stopToken: Atomic[bool]
|
||||
|
||||
proc recvMsg() =
|
||||
while not stopToken.load(moRelaxed):
|
||||
let resp = chan1.tryRecv()
|
||||
if resp.dataAvailable:
|
||||
routeMessage(resp.msg)
|
||||
echo "child consumes ", formatSize getOccupiedMem()
|
||||
|
||||
createThread[void](recv, recvMsg)
|
||||
|
||||
const MESSAGE_COUNT = 100
|
||||
|
||||
proc main() =
|
||||
let msg: BackendMessage = BackendMessage(field: (0..500).toSeq())
|
||||
for j in 0..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(recv)
|
||||
|
||||
main()
|
||||
58
tests/alloc/tmembug2.nim
Normal file
58
tests/alloc/tmembug2.nim
Normal file
@@ -0,0 +1,58 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user