diff --git a/tests/exampleGcFailures/exNoFailureNoGcCollectSeq.nim b/tests/exampleGcFailures/exNoFailureNoGcCollectSeq.nim index 7fa4d0d..973d6ab 100644 --- a/tests/exampleGcFailures/exNoFailureNoGcCollectSeq.nim +++ b/tests/exampleGcFailures/exNoFailureNoGcCollectSeq.nim @@ -4,34 +4,16 @@ 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] - -proc worker(data: seq[char], sig: ThreadSignalPtr) = +proc worker(data: string, sig: ThreadSignalPtr) = os.sleep(4_000) echo "running worker: " echo "worker: ", data 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 = @"hello world!" + var obj = "hello world!" + # obj.shallow() echo "spawn worker" tp.spawn worker(obj, sig) diff --git a/tests/exampleGcFailures/exNoFailureNoGcCollectSeqDestroy.nim b/tests/exampleGcFailures/exNoFailureNoGcCollectSeqDestroy.nim new file mode 100644 index 0000000..7eeee5a --- /dev/null +++ b/tests/exampleGcFailures/exNoFailureNoGcCollectSeqDestroy.nim @@ -0,0 +1,48 @@ +import std/os +import chronos +import chronos/threadsync +import chronos/unittest2/asynctests +import taskpools + +type + Test* = object + count*: int + +proc `=destroy`*(obj: var Test) = + echo "destroy count: ", obj.count, " thread: ", getThreadId() + +proc worker(data: seq[Test], sig: ThreadSignalPtr) = + os.sleep(40) + echo "running worker: ", getThreadId() + echo "worker: ", data + discard sig.fireSync() + +proc runTest(tp: TaskPool, sig: ThreadSignalPtr) {.async.} = + ## init + var obj = @[Test(count: 1), Test(count: 2)] + + echo "spawn worker" + tp.spawn worker(obj, sig) + + obj[0].count = 10 + obj[1].count = 20 + ## adding fut.wait(100.milliseconds) creates memory issue + await wait(sig) + ## just doing the wait is fine: + # await wait(sig) + +proc runTests(tp: TaskPool, sig: ThreadSignalPtr) {.async.} = + for i in 1..1: + try: + echo "\n\nrunning main: ", getThreadId() + await runTest(tp, sig) + os.sleep(200) + except AsyncTimeoutError: + echo "looping..." + +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)