properly close signal even on cancel

This commit is contained in:
Jaremy Creechley 2023-08-25 15:00:18 -07:00 committed by Dmitriy Ryajov
parent 35c4466de0
commit 727f8b6c2a
No known key found for this signature in database
GPG Key ID: DA8C680CE7C657A4
3 changed files with 28 additions and 21 deletions

View File

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

View File

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

View File

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