diff --git a/datastore/threadproxyds.nim b/datastore/threadproxyds.nim index 2b9be6c..20fe110 100644 --- a/datastore/threadproxyds.nim +++ b/datastore/threadproxyds.nim @@ -90,7 +90,9 @@ method put*( echoed "put new request thr: ", $getThreadId() var ret = await newThreadResult(void) - try: + var answer: ?!void + + block: put(ret, self.tds, key, data) echo "\n" echoed "wait put thr: ", $getThreadId() @@ -100,12 +102,15 @@ method put*( echo "\n" await sleepAsync(400.milliseconds) - return ret.convert(void) - finally: + answer = ret.convert(void) + block: echo "\n" await sleepAsync(400.milliseconds) echoed "PUT RELEASE" + echo "PUT RELEASE" ret.release() + + return answer method put*( self: ThreadProxyDatastore, diff --git a/datastore/threads/sharedptr.nim b/datastore/threads/sharedptr.nim index c7a511a..859df5c 100644 --- a/datastore/threads/sharedptr.nim +++ b/datastore/threads/sharedptr.nim @@ -69,7 +69,7 @@ proc decr*[T](x: var SharedPtr[T]) = else: echoed "SharedPtr: decr: ", x.container.pointer.repr, " cnt: ", x.container.cnt, " tp: ", $(typeof(T)) -proc release*[T](x: var SharedPtr[T]) = +template release*[T](x: var SharedPtr[T]) = echoed "SharedPtr: release: ", $(typeof(T)) x.decr() x.container = nil @@ -80,7 +80,8 @@ proc `=destroy`*[T](x: var SharedPtr[T]) = decr(x) proc `=dup`*[T](src: SharedPtr[T]): SharedPtr[T] = - if src.container != nil and src.cnt != nil: + if src.container != nil: + echoed "SharedPtr: dup: ", src.container.pointer.repr, " cnt: ", src.container.cnt, " tp: ", $(typeof(T)) discard atomicAddFetch(src.cnt, 1, ATOMIC_RELAXED) result.container = src.container result.cnt = src.cnt @@ -88,8 +89,8 @@ proc `=dup`*[T](src: SharedPtr[T]): SharedPtr[T] = proc `=copy`*[T](dest: var SharedPtr[T], src: SharedPtr[T]) = if src.container != nil: # echo "SharedPtr: copy: ", src.container.pointer.repr - echoed "SharedPtr: copy:src: ", src.container.pointer.repr, " cnt: ", src.container.cnt, " tp: ", $(typeof(T)) discard atomicAddFetch(addr src.container.cnt, 1, ATOMIC_RELAXED) + echoed "SharedPtr: copy:src: ", src.container.pointer.repr, " cnt: ", src.container.cnt, " tp: ", $(typeof(T)) if dest.container != nil: echoed "SharedPtr: copy:dest: ", dest.container.pointer.repr, " cnt: ", dest.container.cnt, " tp: ", $(typeof(T)) `=destroy`(dest) diff --git a/datastore/threads/threadbackend.nim b/datastore/threads/threadbackend.nim index 55e1ade..a33d610 100644 --- a/datastore/threads/threadbackend.nim +++ b/datastore/threads/threadbackend.nim @@ -150,7 +150,7 @@ proc putTask*( echoed "putTask: FINISH\n" proc put*( - ret: TResult[void], + ret: var TResult[void], tds: ThreadDatastorePtr, key: Key, data: seq[byte] diff --git a/datastore/threads/threadresults.nim b/datastore/threads/threadresults.nim index f4fc8bc..f24fa43 100644 --- a/datastore/threads/threadresults.nim +++ b/datastore/threads/threadresults.nim @@ -61,6 +61,12 @@ proc newThreadResult*[T]( res[].sig = await SharedSignal.new() res +proc `=destroy`*[T](res: var ThreadResult[T]) {.raises: [].} = + ## release TResult and it's ThreadSignal + echoed "ThreadResult:destroy: ", res.addr.pointer.repr, " res: ", $(res) + res[].signal.release() + `=destroy`(res.results) + # proc release*[T](res: var TResult[T]) {.raises: [].} = # ## release TResult and it's ThreadSignal # # res[].signal.release() @@ -71,17 +77,17 @@ template wait*[T](res: TResult[T]): Future[void] = template fireSync*[T](res: TResult[T]): Result[bool, string] = res[].sig.fireSync() -template success*[T](ret: TResult[T], value: T) = +proc success*[T](ret: TResult[T], value: T) = ## convenience wrapper for `TResult` to replicate ## normal questionable api ret[].results.ok(value) -template success*[T: void](ret: TResult[T]) = +proc success*[T: void](ret: TResult[T]) = ## convenience wrapper for `TResult` to replicate ## normal questionable api ret[].results.ok() -template failure*[T](ret: TResult[T], exc: ref Exception) = +proc failure*[T](ret: TResult[T], exc: ref Exception) = ## convenience wrapper for `TResult` to replicate ## normal questionable api ret[].results.err(exc.toBuffer()) @@ -97,6 +103,7 @@ proc convert*[T, S](ret: TResult[T], elif S is string: result.ok(ret[].results.get().toString()) elif S is void: + echoed "TRESULT: OK" result.ok() else: result.ok(ret[].results.get()) diff --git a/tests/datastore/testthreadproxyds.nim b/tests/datastore/testthreadproxyds.nim index 4d6bd89..6584d86 100644 --- a/tests/datastore/testthreadproxyds.nim +++ b/tests/datastore/testthreadproxyds.nim @@ -37,8 +37,8 @@ proc threadTest() = test "check put": # echo "\n\n=== put ===" let res1 = await sds.put(key1, data) - check res1.isOk print "res1: ", res1 + check res1.isOk # GC_fullCollect() proc main() =