mirror of
https://github.com/logos-storage/apatheia.git
synced 2026-01-02 13:03:11 +00:00
add seq destroy example
This commit is contained in:
parent
bc4d8d3095
commit
eff04d8efa
@ -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)
|
||||
|
||||
48
tests/exampleGcFailures/exNoFailureNoGcCollectSeqDestroy.nim
Normal file
48
tests/exampleGcFailures/exNoFailureNoGcCollectSeqDestroy.nim
Normal file
@ -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)
|
||||
Loading…
x
Reference in New Issue
Block a user