mirror of
https://github.com/logos-storage/nim-datastore.git
synced 2026-01-03 14:13:09 +00:00
sharedptr
This commit is contained in:
parent
9ced6620a5
commit
9c7c8393bd
@ -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))
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user