From 5a3d098557de4306626ef4da503bd4fd471cce99 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Wed, 21 Feb 2024 22:39:22 -0700 Subject: [PATCH] more examples --- tests/exFailureNoGcCollect.nim | 63 ++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 tests/exFailureNoGcCollect.nim diff --git a/tests/exFailureNoGcCollect.nim b/tests/exFailureNoGcCollect.nim new file mode 100644 index 0000000..9622ec2 --- /dev/null +++ b/tests/exFailureNoGcCollect.nim @@ -0,0 +1,63 @@ +import std/os +import chronos +import chronos/threadsync +import chronos/unittest2/asynctests +import taskpools + +type + Seq*[T] = object + data*: ptr UncheckedArray[T] + size*: int + + DataObj = ref object + mockSeq: Seq[char] + +template toOpenArray*[T](arr: Seq[T]): auto = + system.toOpenArray(arr.data, 0, arr.size) + +proc worker(data: ptr Seq[char], sig: ThreadSignalPtr) = + os.sleep(2_000) + echo "running worker: " + assert data[].data != nil + echo "worker: ", data[].toOpenArray() + discard sig.fireSync() + +proc finalizer(obj: DataObj) = + echo "finalize DataObj and freeing mockSeq" + obj.mockSeq.data.dealloc() + obj.mockSeq.data = nil + +proc initMockSeq(msg: string): Seq[char] = + result.data = cast[ptr UncheckedArray[char]](alloc0(13)) + for i, c in msg: + result.data[i] = c + result.size = 12 + +proc runTest(tp: TaskPool, sig: ThreadSignalPtr) {.async.} = + ## init + var obj: DataObj + obj.new(finalizer) + obj.mockSeq = initMockSeq("hello world!") + + echo "spawn worker" + tp.spawn worker(addr obj.mockSeq, sig) + + ## adding fut.wait(100.milliseconds) creates memory issue + await wait(sig).wait(10.milliseconds) + ## just doing the wait is fine: + # await wait(sig) + +proc runTests(tp: TaskPool, sig: ThreadSignalPtr) {.async.} = + for i in 1..2_000: + try: + await runTest(tp, sig) + os.sleep(200) + except AsyncTimeoutError: + echo "Run GC" + +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)