From bfd1078d3c45c61fd8e3661b6d1a646213ffb153 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Sat, 24 Feb 2024 15:08:02 -0700 Subject: [PATCH] updates --- tests/exampleGcFailures/exFailureSeqSeq.nim | 71 +++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 tests/exampleGcFailures/exFailureSeqSeq.nim diff --git a/tests/exampleGcFailures/exFailureSeqSeq.nim b/tests/exampleGcFailures/exFailureSeqSeq.nim new file mode 100644 index 0000000..beffd08 --- /dev/null +++ b/tests/exampleGcFailures/exFailureSeqSeq.nim @@ -0,0 +1,71 @@ +import std/os +import std/sequtils +import chronos +import chronos/threadsync +import chronos/unittest2/asynctests +import taskpools + +## 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. +## + +type + SeqDataPtr*[T] = object + data*: ptr UncheckedArray[T] + size*: int + +template toOpenArray*[T](arr: SeqDataPtr[T]): auto = + system.toOpenArray(arr.data, 0, arr.size) + +proc toSeqDataPtr*[T](data: seq[T]): SeqDataPtr[T] = + SeqDataPtr[T]( + data: cast[ptr UncheckedArray[T]](unsafeAddr(data[0])), size: data.len() + ) + +proc worker(data: ptr seq[seq[char]], sig: ThreadSignalPtr) = + os.sleep(10) + echo "running worker: " + echo "worker: ", data[] + for i, d in data[]: + for j, c in d: + data[i][j] = char(c.uint8 + 10) + discard sig.fireSync() + +proc runTest(tp: TaskPool, sig: ThreadSignalPtr) {.async.} = + ## init + var obj1 = "hello world!".toSeq() + var obj2 = "goodbye denver!".toSeq() + var data = @[obj1, obj2] + + # echo "spawn worker" + tp.spawn worker(addr data, sig) + + ## adding fut.wait(100.milliseconds) creates memory issue + await wait(sig).wait(1.milliseconds) + ## just doing the wait is fine: + # await wait(sig) + +proc runTests(tp: TaskPool, sig: ThreadSignalPtr) {.async.} = + for i in 1..30_000: + try: + await runTest(tp, sig) + except AsyncTimeoutError: + # os.sleep(1) + # echo "looping..." + # GC_fullCollect() + discard + +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) + os.sleep(10_000)