From 5fd1e789bbbf6822b989bd4c33d580d39fad0609 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Tue, 19 Mar 2024 13:53:29 +0200 Subject: [PATCH] add ptr seq-seq example --- .../exNoFailurePtrSeqSeq.nim | 60 +++++++++++++++++++ ...ailureSeqSeq.nim => exNoFailureSeqSeq.nim} | 8 +-- 2 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 tests/exampleGcFailures/exNoFailurePtrSeqSeq.nim rename tests/exampleGcFailures/{exFailureSeqSeq.nim => exNoFailureSeqSeq.nim} (89%) diff --git a/tests/exampleGcFailures/exNoFailurePtrSeqSeq.nim b/tests/exampleGcFailures/exNoFailurePtrSeqSeq.nim new file mode 100644 index 0000000..5043af2 --- /dev/null +++ b/tests/exampleGcFailures/exNoFailurePtrSeqSeq.nim @@ -0,0 +1,60 @@ +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. +## + +proc worker(data: ptr seq[seq[char]], sig: ThreadSignalPtr) = + # os.sleep(100) + echo "running worker: " + echo "worker: ", data.pointer.repr + echo "worker: ", data[] + # for i, d in data: + # for j, c in d: + # data[i][j] = char(c.uint8 + 10) + GC_fullCollect() + discard sig.fireSync() + +proc runTest(tp: TaskPool, sig: ThreadSignalPtr, i: int) {.async.} = + ## init + # await sleepAsync(10.milliseconds) + var obj1 = ("hello world! " & $i).toSeq() + var obj2 = "goodbye denver!".toSeq() + var data = @[obj1, obj2] + + # echo "spawn worker" + tp.spawn worker(addr data, sig) + + await wait(sig) + echo "data: ", data.addr.pointer.repr + echo "data: ", data + echo "" + +proc runTests(tp: TaskPool, sig: ThreadSignalPtr) {.async.} = + var futs = newSeq[Future[void]]() + for i in 1..40_000: + let f = runTest(tp, sig, i) + # futs.add f + await f + GC_fullCollect() + await allFutures(futs) + +suite "async tests": + var tp = Taskpool.new(num_threads = 4) # Default to the number of hardware threads. + let sig = ThreadSignalPtr.new().get() + + asyncTest "test": + await runTests(tp, sig) + # os.sleep(10_000) diff --git a/tests/exampleGcFailures/exFailureSeqSeq.nim b/tests/exampleGcFailures/exNoFailureSeqSeq.nim similarity index 89% rename from tests/exampleGcFailures/exFailureSeqSeq.nim rename to tests/exampleGcFailures/exNoFailureSeqSeq.nim index 16c9f51..f723391 100644 --- a/tests/exampleGcFailures/exFailureSeqSeq.nim +++ b/tests/exampleGcFailures/exNoFailureSeqSeq.nim @@ -16,11 +16,11 @@ import taskpools ## generally does so in a few seconds of running. ## -proc worker(data: seq[seq[char]], sig: ThreadSignalPtr) = +proc worker(data: ptr seq[seq[char]], sig: ThreadSignalPtr) = # os.sleep(100) echo "running worker: " - echo "worker: ", data.unsafeAddr.pointer.repr - echo "worker: ", data + echo "worker: ", data.pointer.repr + echo "worker: ", data[] # for i, d in data: # for j, c in d: # data[i][j] = char(c.uint8 + 10) @@ -35,7 +35,7 @@ proc runTest(tp: TaskPool, sig: ThreadSignalPtr, i: int) {.async.} = var data = @[obj1, obj2] # echo "spawn worker" - tp.spawn worker(data, sig) + tp.spawn worker(addr data, sig) await wait(sig) echo "data: ", data.addr.pointer.repr