diff --git a/datastore/sharedds.nim b/datastore/sharedds.nim index 92d82e5..7f5afc9 100644 --- a/datastore/sharedds.nim +++ b/datastore/sharedds.nim @@ -93,7 +93,15 @@ method close*( self: SharedDatastore ): Future[?!void] {.async.} = # TODO: how to handle failed close? - return success() + echo "ThreadDatastore: FREE: " + result = success() + + without res =? self.tds[].ds.close(), err: + result = failure(err) + + if self.tds[].tp != nil: + ## this can block... how to handle? maybe just leak? + self.tds[].tp.shutdown() proc newSharedDataStore*( # T: typedesc[SharedDatastore], diff --git a/datastore/threadbackend.nim b/datastore/threadbackend.nim index 48695fa..2f01923 100644 --- a/datastore/threadbackend.nim +++ b/datastore/threadbackend.nim @@ -56,6 +56,7 @@ type ThreadDatastore* = object tp*: Taskpool backend*: ThreadBackendKind + ds*: Datastore ThreadDatastorePtr* = SharedPtr[ThreadDatastore] @@ -64,10 +65,6 @@ type TestPtr* = SharedPtr[Test] -var - fsDatastore {.threadvar.}: FSDatastore ##\ - ## TODO: figure out a better way to capture this? - proc newThreadResult*[T]( tp: typedesc[T] ): Result[TResult[T], ref CatchableError] = @@ -79,39 +76,6 @@ proc newThreadResult*[T]( res[].signal = signal.get() ok res -proc startupDatastore( - ret: TResult[ThreadDatastorePtr], - backend: ThreadBackend, -) {.raises: [].} = - ## starts up a FS instance on a give thread - echo "\n" - echo "\nstartupDatastore: threadId:", getThreadId() - print "\nstartupDatastore: backend:\n", backend - - echo "" - case backend.kind: - of FSBackend: - let ds = FSDatastore.new( - root = backend.root.toString(), - depth = backend.depth, - caseSensitive = backend.caseSensitive, - ignoreProtected = backend.ignoreProtected - ) - if ds.isOk: - fsDatastore = ds.get() - ret[].state = Success - else: - ret[].state = Error - ret[].state = Success - of TestBackend: - echo "startupDatastore: TestBackend" - ret[].value[].backend = TestBackend - ret[].state = Success - else: - discard - - print "startupDatastore: signal", ret[].signal.fireSync() - proc getTask*( ret: TResult[DataBuffer], backend: ThreadBackendKind, @@ -167,6 +131,8 @@ proc put*( tds[].tp.spawn putTask(ret, tds[].backend, bkey, bval) +proc startupDatastore(ret: TResult[ThreadDatastorePtr], backend: ThreadBackend,) {.raises: [].} + proc createThreadDatastore*( ret: TResult[ThreadDatastorePtr], backend: ThreadBackend, @@ -184,3 +150,38 @@ proc createThreadDatastore*( ret[].error = exc.toBuffer() discard + +proc startupDatastore( + ret: TResult[ThreadDatastorePtr], + backend: ThreadBackend, +) {.raises: [].} = + ## starts up a FS instance on a give thread + echo "\n" + echo "\nstartupDatastore: threadId:", getThreadId() + print "\nstartupDatastore: backend:\n", backend + + echo "" + case backend.kind: + of FSBackend: + let ds = FSDatastore.new( + root = backend.root.toString(), + depth = backend.depth, + caseSensitive = backend.caseSensitive, + ignoreProtected = backend.ignoreProtected + ) + if ds.isOk: + let ds = ds.get() + GC_ref(ds) + ret[].value[].ds = ds + ret[].state = Success + else: + ret[].state = Error + ret[].state = Success + of TestBackend: + echo "startupDatastore: TestBackend" + ret[].value[].backend = TestBackend + ret[].state = Success + else: + discard + + # print "startupDatastore: signal", ret[].signal.fireSync()