From 97d4e68f5d832065ac1656dac2c130c23787bbda Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Tue, 12 Sep 2023 20:19:57 -0700 Subject: [PATCH] switch to custom sharedptr --- datastore/threads/sharedptr.nim | 6 +++++- datastore/threads/threadresults.nim | 2 +- tests/datastore/testthreadproxyds.nim | 9 +++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/datastore/threads/sharedptr.nim b/datastore/threads/sharedptr.nim index e46e70f..a2af3cb 100644 --- a/datastore/threads/sharedptr.nim +++ b/datastore/threads/sharedptr.nim @@ -43,6 +43,11 @@ proc decr*[T](x: var SharedPtr[T]) = else: echo "SharedPtr: decr: ", repr x.val.pointer, " ", x.cnt[], " tp: ", $(typeof(T)) +proc release*[T](x: var SharedPtr[T]) = + x.decr() + x.val = nil + x.cnt = nil + proc `=destroy`*[T](x: var SharedPtr[T]) = if x.val != nil: echo "SharedPtr: destroy: ", repr x.val.pointer, " cnt: ", x.cnt.repr, " tp: ", $(typeof(T)) @@ -74,7 +79,6 @@ template newSharedPtr*[T](val: T): SharedPtr[T] = proc newSharedPtr*[T](t: typedesc[T]): SharedPtr[T] = ## Returns a shared pointer. It is not initialized, - ## so reading from it before writing to it is undefined behaviour! result.cnt = cast[ptr int](allocShared0(sizeof(result.cnt))) result.val = cast[typeof(result.val)](allocShared0(sizeof(result.val[]))) result.cnt[] = 0 diff --git a/datastore/threads/threadresults.nim b/datastore/threads/threadresults.nim index 12213eb..cbec039 100644 --- a/datastore/threads/threadresults.nim +++ b/datastore/threads/threadresults.nim @@ -63,7 +63,7 @@ proc newThreadResult*[T]( proc release*[T](res: var TResult[T]) {.raises: [].} = ## release TResult and it's ThreadSignal res[].signal.release() - res.decr() + sharedptr.release(res) proc success*[T](ret: TResult[T], value: T) = ## convenience wrapper for `TResult` to replicate diff --git a/tests/datastore/testthreadproxyds.nim b/tests/datastore/testthreadproxyds.nim index 1821703..887e144 100644 --- a/tests/datastore/testthreadproxyds.nim +++ b/tests/datastore/testthreadproxyds.nim @@ -32,10 +32,11 @@ proc threadTest() = test "check put": # echo "\n\n=== put ===" - let res1 = await sds.put(key1, data) - check res1.isOk - # print "res1: ", res1 - GC_fullCollect() + for i in 1..3: + let res1 = await sds.put(key1, data) + check res1.isOk + # print "res1: ", res1 + GC_fullCollect() threadTest() GC_fullCollect()