From 892bd550d5f54fc12b9f201167628180a550e84d Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Fri, 25 Aug 2023 15:00:18 -0700 Subject: [PATCH] properly close signal even on cancel --- datastore/sharedds.nim | 33 +++++++++++++++++++------------- datastore/threadbackend.nim | 4 ---- tests/datastore/testsharedds.nim | 12 ++++++++---- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/datastore/sharedds.nim b/datastore/sharedds.nim index 9820deb..cef050f 100644 --- a/datastore/sharedds.nim +++ b/datastore/sharedds.nim @@ -52,9 +52,12 @@ method get*( without ret =? newThreadResult(DataBuffer), err: return failure(err) - get(ret, self.tds, key) - await wait(ret[].signal) - ret[].signal.close() + try: + get(ret, self.tds, key) + await wait(ret[].signal) + finally: + echo "closing signal" + ret[].signal.close() echo "\nSharedDataStore:put:value: ", ret[].repr let data = ret[].value.toSeq(byte) @@ -70,10 +73,12 @@ method put*( return failure(err) echo "res: ", ret - put(ret, self.tds, key, data) - await wait(ret[].signal) - echo "closing signal" - ret[].signal.close() + try: + put(ret, self.tds, key, data) + await wait(ret[].signal) + finally: + echo "closing signal" + ret[].signal.close() echo "\nSharedDataStore:put:value: ", ret[].repr return success() @@ -103,12 +108,14 @@ proc newSharedDataStore*( without res =? newThreadResult(ThreadDatastorePtr), err: return failure(err) - res[].value = newSharedPtr(ThreadDatastore) - - echo "\nnewDataStore: threadId:", getThreadId() - res.createThreadDatastore(backend) - await wait(res[].signal) - res[].signal.close() + try: + res[].value = newSharedPtr(ThreadDatastore) + echo "\nnewDataStore: threadId:", getThreadId() + res.createThreadDatastore(backend) + await wait(res[].signal) + finally: + echo "closing signal" + res[].signal.close() echo "\nnewSharedDataStore:state: ", res[].state.repr echo "\nnewSharedDataStore:value: ", res[].value[].backend.repr diff --git a/datastore/threadbackend.nim b/datastore/threadbackend.nim index 9bde2b7..f91d7ce 100644 --- a/datastore/threadbackend.nim +++ b/datastore/threadbackend.nim @@ -68,10 +68,6 @@ var fsDatastore {.threadvar.}: FSDatastore ##\ ## TODO: figure out a better way to capture this? -proc `=destroy`*[T](x: var ThreadResult[T]) = - when T isnot void: - x.value.`=destroy` - proc newThreadResult*[T](tp: typedesc[T]): Result[TResult[T], ref CatchableError] = let res = newSharedPtr(ThreadResult[T]) let signal = ThreadSignalPtr.new() diff --git a/tests/datastore/testsharedds.nim b/tests/datastore/testsharedds.nim index 1f87056..5c47f43 100644 --- a/tests/datastore/testsharedds.nim +++ b/tests/datastore/testsharedds.nim @@ -31,10 +31,8 @@ suite "Test Basic SharedDatastore": echo "\n\n=== put ===" let key1 = Key.init("/a").tryGet - # let res1 = await sds.put(key1, "value for 1".toBytes()) - let res1 = sds.put(key1, "value for 1".toBytes()) - res1.cancel() - echo "res1: ", res1.repr + let res1 = await sds.put(key1, "value for 1".toBytes()) + print "res1: ", res1 echo "\n\n=== get ===" let res2 = await sds.get(key1) @@ -44,6 +42,12 @@ suite "Test Basic SharedDatastore": 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 + # suite "Test Basic FSDatastore": # let # path = currentSourcePath() # get this file's name