From 9c7c8393bd22a39829f90014e6de042faa5c7e7a Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Tue, 12 Sep 2023 19:15:22 -0700 Subject: [PATCH] sharedptr --- datastore/threads/sharedptr.nim | 17 ++--- tests/datastore/testthreadproxyds.nim | 93 +++++++++++++-------------- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/datastore/threads/sharedptr.nim b/datastore/threads/sharedptr.nim index 06a64d4..2393902 100644 --- a/datastore/threads/sharedptr.nim +++ b/datastore/threads/sharedptr.nim @@ -24,31 +24,32 @@ type val*: ptr T proc incr*[T](a: SharedPtr[T]) = - let res = atomicAddFetch(a.cnt, 1, ATOMIC_RELAXED) - echo "SharedPtr: manual incr: ", res + if a.val != nil and a.cnt != nil: + let res = atomicAddFetch(a.cnt, 1, ATOMIC_RELAXED) + echo "SharedPtr: manual incr: ", res proc decr*[T](x: SharedPtr[T]) = if x.val != nil and x.cnt != nil: let res = atomicSubFetch(x.cnt, 1, ATOMIC_ACQUIRE) if res == 0: - echo "SharedPtr: FREE: ", repr x.val.pointer, " ", x.cnt[] + echo "SharedPtr: FREE: ", repr x.val.pointer, " ", x.cnt[], " tp: ", $(typeof(T)) deallocShared(x.val) deallocShared(x.cnt) else: - echo "SharedPtr: decr: ", repr x.val.pointer, " ", x.cnt[] + echo "SharedPtr: decr: ", repr x.val.pointer, " ", x.cnt[], " tp: ", $(typeof(T)) proc `=destroy`*[T](x: var SharedPtr[T]) = - echo "SharedPtr: destroy: ", repr x.val.pointer, " ", x.cnt.repr + echo "SharedPtr: destroy: ", repr x.val.pointer, " ", x.cnt.repr, " tp: ", $(typeof(T)) # echo "SharedPtr: destroy:st: ", ($getStackTrace()).split("\n").join(";") decr(x) proc `=dup`*[T](src: SharedPtr[T]): SharedPtr[T] = - if src.val != nil: + if src.val != nil and src.cnt != nil: discard atomicAddFetch(src.cnt, 1, ATOMIC_RELAXED) result.val = src.val proc `=copy`*[T](dest: var SharedPtr[T], src: SharedPtr[T]) = - if src.val != nil: + if src.val != nil and src.cnt != nil: # echo "SharedPtr: copy: ", src.val.pointer.repr discard atomicAddFetch(src.cnt, 1, ATOMIC_RELAXED) `=destroy`(dest) @@ -59,7 +60,7 @@ proc newSharedPtr*[T](val: sink Isolated[T]): SharedPtr[T] {.nodestroy.} = ## ownership of the object by reference counting. result.cnt = cast[ptr int](allocShared0(sizeof(result.cnt))) result.val = cast[typeof(result.val)](allocShared(sizeof(result.val[]))) - int(result.val.counter) = 1 + result.cnt[] = 1 result.val.value = extract val echo "SharedPtr: alloc: ", result.val.pointer.repr, " tp: ", $(typeof(T)) diff --git a/tests/datastore/testthreadproxyds.nim b/tests/datastore/testthreadproxyds.nim index b57480c..74db804 100644 --- a/tests/datastore/testthreadproxyds.nim +++ b/tests/datastore/testthreadproxyds.nim @@ -35,65 +35,64 @@ suite "Test Basic ThreadProxyDatastore": check res1.isOk # print "res1: ", res1 +# test "check get": +# # echo "\n\n=== get ===" +# let res2 = await sds.get(key1) +# check res2.get() == data +# var val = "" +# for c in res2.get(): +# val &= char(c) +# # print "get res2: ", $val - test "check get": - # echo "\n\n=== get ===" - let res2 = await sds.get(key1) - check res2.get() == data - var val = "" - for c in res2.get(): - val &= char(c) - # print "get res2: ", $val +# # echo "\n\n=== put cancel ===" +# # # let res1 = await sds.put(key1, "value for 1".toBytes()) +# # let res3 = sds.put(key1, "value for 1".toBytes()) +# # res3.cancel() +# # # print "res3: ", res3 - # echo "\n\n=== put cancel ===" - # # let res1 = await sds.put(key1, "value for 1".toBytes()) - # let res3 = sds.put(key1, "value for 1".toBytes()) - # res3.cancel() - # # print "res3: ", res3 +# suite "Test Basic ThreadProxyDatastore": -suite "Test Basic ThreadProxyDatastore": +# var +# memStore: MemoryDatastore +# ds: ThreadProxyDatastore +# key = Key.init("/a/b").tryGet() +# bytes = "some bytes".toBytes +# otherBytes = "some other bytes".toBytes - var - memStore: MemoryDatastore - ds: ThreadProxyDatastore - key = Key.init("/a/b").tryGet() - bytes = "some bytes".toBytes - otherBytes = "some other bytes".toBytes +# setupAll: +# memStore = MemoryDatastore.new() +# ds = newThreadProxyDatastore(memStore).expect("should work") - setupAll: - memStore = MemoryDatastore.new() - ds = newThreadProxyDatastore(memStore).expect("should work") +# teardownAll: +# (await memStore.close()).get() - teardownAll: - (await memStore.close()).get() +# basicStoreTests(ds, key, bytes, otherBytes) - basicStoreTests(ds, key, bytes, otherBytes) +# suite "Test Query": +# var +# mem: MemoryDatastore +# sds: ThreadProxyDatastore -suite "Test Query": - var - mem: MemoryDatastore - sds: ThreadProxyDatastore +# setup: +# mem = MemoryDatastore.new() +# sds = newThreadProxyDatastore(mem).expect("should work") - setup: - mem = MemoryDatastore.new() - sds = newThreadProxyDatastore(mem).expect("should work") +# queryTests(sds, false) - queryTests(sds, false) +# test "query iter fails": - test "query iter fails": +# expect FutureDefect: +# let q = Query.init(key1) - expect FutureDefect: - let q = Query.init(key1) +# (await sds.put(key1, val1)).tryGet +# (await sds.put(key2, val2)).tryGet +# (await sds.put(key3, val3)).tryGet - (await sds.put(key1, val1)).tryGet - (await sds.put(key2, val2)).tryGet - (await sds.put(key3, val3)).tryGet - - let - iter = (await sds.query(q)).tryGet - res = (await allFinished(toSeq(iter))) - .mapIt( it.read.tryGet ) - .filterIt( it.key.isSome ) +# let +# iter = (await sds.query(q)).tryGet +# res = (await allFinished(toSeq(iter))) +# .mapIt( it.read.tryGet ) +# .filterIt( it.key.isSome ) - check res.len() > 0 +# check res.len() > 0