apatheia/tests/exampleGcFailures/exFailureSeq.nim

69 lines
1.7 KiB
Nim
Raw Normal View History

2024-02-21 22:39:22 -07:00
import std/os
2024-02-21 22:49:22 -07:00
import std/sequtils
2024-02-21 22:39:22 -07:00
import chronos
import chronos/threadsync
import chronos/unittest2/asynctests
import taskpools
2024-02-21 22:56:17 -07:00
## create a probablistically likely failure of
## using sequence memory from another thread
## with refc.
##
## However, unlike `exFailure.nim`, this can take
## a while to run.
##
## It may not always produce an error either, but
## generally does so in a few seconds of running.
##
2024-02-21 22:39:22 -07:00
type
2024-02-21 22:57:43 -07:00
SeqDataPtr*[T] = object
2024-02-21 22:39:22 -07:00
data*: ptr UncheckedArray[T]
size*: int
2024-02-21 22:57:43 -07:00
template toOpenArray*[T](arr: SeqDataPtr[T]): auto =
2024-02-21 22:39:22 -07:00
system.toOpenArray(arr.data, 0, arr.size)
2024-02-21 23:00:03 -07:00
proc toSeqDataPtr*[T](data: seq[T]): SeqDataPtr[T] =
2024-02-21 22:57:43 -07:00
SeqDataPtr[T](
2024-02-21 22:49:22 -07:00
data: cast[ptr UncheckedArray[T]](unsafeAddr(data[0])), size: data.len()
)
2024-02-21 22:57:43 -07:00
proc worker(data: SeqDataPtr[char], sig: ThreadSignalPtr) =
2024-02-21 23:42:49 -07:00
os.sleep(10)
2024-02-21 22:39:22 -07:00
echo "running worker: "
2024-02-21 22:49:22 -07:00
echo "worker: ", data.toOpenArray()
for i, c in data.toOpenArray():
data.data[i] = char(c.uint8 + 10)
2024-02-21 22:39:22 -07:00
discard sig.fireSync()
proc runTest(tp: TaskPool, sig: ThreadSignalPtr) {.async.} =
## init
2024-02-21 23:00:03 -07:00
var obj = "hello world!".toSeq()
2024-02-21 22:39:22 -07:00
2024-02-21 23:41:11 -07:00
# echo "spawn worker"
2024-02-21 23:00:03 -07:00
tp.spawn worker(obj.toSeqDataPtr(), sig)
2024-02-21 22:39:22 -07:00
## adding fut.wait(100.milliseconds) creates memory issue
2024-02-21 23:41:11 -07:00
await wait(sig).wait(1.milliseconds)
2024-02-21 22:39:22 -07:00
## just doing the wait is fine:
# await wait(sig)
proc runTests(tp: TaskPool, sig: ThreadSignalPtr) {.async.} =
2024-02-21 23:41:11 -07:00
for i in 1..30_000:
2024-02-21 22:39:22 -07:00
try:
await runTest(tp, sig)
except AsyncTimeoutError:
2024-02-21 23:41:11 -07:00
# os.sleep(1)
# echo "looping..."
# GC_fullCollect()
discard
2024-02-21 22:39:22 -07:00
suite "async tests":
var tp = Taskpool.new(num_threads = 2) # Default to the number of hardware threads.
let sig = ThreadSignalPtr.new().get()
asyncTest "test":
await runTests(tp, sig)
2024-02-21 23:41:11 -07:00
os.sleep(10_000)