diff --git a/datastore/sharedds.nim b/datastore/sharedds.nim index 7f5afc9..769e964 100644 --- a/datastore/sharedds.nim +++ b/datastore/sharedds.nim @@ -7,12 +7,13 @@ import pkg/questionable/results import pkg/upraises import pkg/taskpools import pkg/stew/results +import pkg/threading/smartptrs import ./key import ./query import ./datastore import ./threadbackend -import threading/smartptrs +import ./fsds import pretty @@ -98,14 +99,14 @@ method close*( without res =? self.tds[].ds.close(), err: result = failure(err) + # GC_unref(self.tds[].ds) ## TODO: is this needed? if self.tds[].tp != nil: ## this can block... how to handle? maybe just leak? self.tds[].tp.shutdown() -proc newSharedDataStore*( - # T: typedesc[SharedDatastore], - backend: ThreadBackend, +proc newSharedDataStore*[T: Datastore]( + ds: Datastore, ): Future[?!SharedDatastore] {.async.} = var @@ -113,11 +114,12 @@ proc newSharedDataStore*( without res =? newThreadResult(ThreadDatastorePtr), err: return failure(err) - + try: res[].value = newSharedPtr(ThreadDatastore) echo "\nnewDataStore: threadId:", getThreadId() - res.createThreadDatastore(backend) + # GC_ref(ds) + res[].value[].ds = ds await wait(res[].signal) finally: echo "closing signal" diff --git a/datastore/threadbackend.nim b/datastore/threadbackend.nim index 2f01923..6c06231 100644 --- a/datastore/threadbackend.nim +++ b/datastore/threadbackend.nim @@ -10,8 +10,6 @@ import ./datastore import ./databuffer import threading/smartptrs -import fsds - import pretty export key, query, smartptrs, databuffer @@ -131,8 +129,6 @@ 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, @@ -150,38 +146,3 @@ 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()