mirror of
https://github.com/logos-storage/apatheia.git
synced 2026-01-03 13:33:08 +00:00
67 lines
1.7 KiB
Nim
67 lines
1.7 KiB
Nim
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
|
|
SeqCursor* = object
|
|
data* {.cursor.}: seq[seq[char]]
|
|
|
|
proc worker(data: SeqCursor, sig: ThreadSignalPtr) =
|
|
os.sleep(10)
|
|
echo "running worker: "
|
|
echo "worker: ", data.data
|
|
echo "worker:addr: ", cast[pointer](data.data).repr
|
|
# for i, d in data.data:
|
|
# for j, c in d:
|
|
# data.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]
|
|
var cur = SeqCursor(data: data)
|
|
|
|
# echo "spawn worker"
|
|
tp.spawn worker(cur, sig)
|
|
|
|
## adding fut.wait(100.milliseconds) creates memory issue
|
|
await wait(sig)
|
|
echo "data:addr: ", data.addr.pointer.repr
|
|
echo "data:cursor:addr: ", cast[pointer](cur.data).repr
|
|
## just doing the wait is fine:
|
|
# await wait(sig)
|
|
|
|
proc runTests(tp: TaskPool, sig: ThreadSignalPtr) {.async.} =
|
|
for i in 1..1:
|
|
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)
|