From 5ef4196e5139fa69d29405eb1e354a84b4da8ddb Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Thu, 24 Aug 2023 17:59:43 -0700 Subject: [PATCH] plumbing values --- datastore.nimble | 1 + datastore/databuffer.nim | 1 - datastore/sharedds.nim | 14 +++++--------- datastore/threadbackend.nim | 16 ++++++++++++---- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/datastore.nimble b/datastore.nimble index e14bb51..93ec6af 100644 --- a/datastore.nimble +++ b/datastore.nimble @@ -14,6 +14,7 @@ requires "nim >= 1.2.0", "stew", "unittest2", "patty", + "threading", "upraises >= 0.1.0 & < 0.2.0" task coverage, "generates code coverage report": diff --git a/datastore/databuffer.nim b/datastore/databuffer.nim index dd745fa..1367b40 100644 --- a/datastore/databuffer.nim +++ b/datastore/databuffer.nim @@ -7,7 +7,6 @@ import std/atomics import events - type DataBuffer* = object cnt: ptr int diff --git a/datastore/sharedds.nim b/datastore/sharedds.nim index a374a11..512836a 100644 --- a/datastore/sharedds.nim +++ b/datastore/sharedds.nim @@ -67,12 +67,11 @@ method put*( data: seq[byte] ): Future[?!void] {.async.} = - let signal = ThreadSignalPtr.new() - if signal.isErr: - return failure("error creating signal") - else: - await wait(signal.get()) - return success() + let signal = ThreadSignalPtr.new().valueOr: + return failure newException(DatastoreError, "error creating signal") + + await wait(signal) + return success() method put*( self: SharedDatastore, @@ -84,9 +83,6 @@ method close*( self: SharedDatastore ): Future[?!void] {.async.} = - # for s in self.stores.values: - # discard await s.store.close() - # TODO: how to handle failed close? return success() diff --git a/datastore/threadbackend.nim b/datastore/threadbackend.nim index 6970443..9e4d7f2 100644 --- a/datastore/threadbackend.nim +++ b/datastore/threadbackend.nim @@ -8,6 +8,7 @@ import ./key import ./query import ./datastore import ./databuffer +import threading/smartptrs import fsds @@ -16,6 +17,11 @@ export key, query push: {.upraises: [].} type + + ThreadResult*[T: DataBuffer | void] = Result[T, CatchableErrorBuffer] + + TResult*[T] = UniquePtr[ThreadResult[T]] + ThreadBackendKind* {.pure.} = enum FSBackend SQliteBackend @@ -35,6 +41,9 @@ type var backendDatastore {.threadvar.}: Datastore +proc new*[T](tp: typedesc[TResult[T]]): TResult[T] = + newUniquePtr(ThreadResult[T]) + proc startupDatastore(backend: ThreadBackend): bool = ## starts up a FS instance on a give thread case backend.kind: @@ -61,11 +70,10 @@ proc put*( self: ThreadDatastore, signal: ThreadSignalPtr, key: KeyBuffer, - data: DataBuffer -): Result[void, CatchableErrorBuffer] = - - return ok() + data: DataBuffer, +): TResult[void] = + return TResult[void].new() proc close*( self: ThreadDatastore,