sharedptr

This commit is contained in:
Jaremy Creechley 2023-09-12 19:15:22 -07:00
parent 9ced6620a5
commit 9c7c8393bd
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
2 changed files with 55 additions and 55 deletions

View File

@ -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))

View File

@ -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