mirror of
https://github.com/logos-storage/nim-datastore.git
synced 2026-01-07 16:13:07 +00:00
integrate setups
This commit is contained in:
parent
ca9edb2798
commit
d34cbd7df5
@ -72,31 +72,6 @@ proc acquireSignal(): ?!ThreadSignalPtr =
|
|||||||
else:
|
else:
|
||||||
success signal.get()
|
success signal.get()
|
||||||
|
|
||||||
template dispatchTask[T](self: ThreadDatastore,
|
|
||||||
signal: ThreadSignalPtr,
|
|
||||||
blk: untyped
|
|
||||||
): auto =
|
|
||||||
var
|
|
||||||
ctx {.inject.} = TaskCtx[T](signal: signal)
|
|
||||||
try:
|
|
||||||
case self.backend.kind:
|
|
||||||
of Sqlite:
|
|
||||||
var ds {.inject.} = self.backend.sql
|
|
||||||
proc runTask() =
|
|
||||||
`blk`
|
|
||||||
runTask()
|
|
||||||
|
|
||||||
await wait(ctx.signal)
|
|
||||||
except CancelledError as exc:
|
|
||||||
trace "Cancelling thread future!", exc = exc.msg
|
|
||||||
while not ctx.setCancelled():
|
|
||||||
warn "waiting to cancel thread future!", fn = astToStr(fn)
|
|
||||||
await sleepAsync(10.milliseconds)
|
|
||||||
raise exc
|
|
||||||
finally:
|
|
||||||
discard ctx.signal.close()
|
|
||||||
self.semaphore.release()
|
|
||||||
|
|
||||||
template executeTask[T](ctx: ptr TaskCtx[T], blk: untyped) =
|
template executeTask[T](ctx: ptr TaskCtx[T], blk: untyped) =
|
||||||
try:
|
try:
|
||||||
withLock(ctxLock):
|
withLock(ctxLock):
|
||||||
@ -122,6 +97,31 @@ template executeTask[T](ctx: ptr TaskCtx[T], blk: untyped) =
|
|||||||
finally:
|
finally:
|
||||||
discard ctx[].signal.fireSync()
|
discard ctx[].signal.fireSync()
|
||||||
|
|
||||||
|
template dispatchTask[T](self: ThreadDatastore,
|
||||||
|
signal: ThreadSignalPtr,
|
||||||
|
blk: untyped
|
||||||
|
): auto =
|
||||||
|
var
|
||||||
|
ctx {.inject.} = TaskCtx[T](signal: signal)
|
||||||
|
try:
|
||||||
|
case self.backend.kind:
|
||||||
|
of Sqlite:
|
||||||
|
var ds {.inject.} = self.backend.sql
|
||||||
|
proc runTask() =
|
||||||
|
`blk`
|
||||||
|
runTask()
|
||||||
|
|
||||||
|
await wait(ctx.signal)
|
||||||
|
except CancelledError as exc:
|
||||||
|
trace "Cancelling thread future!", exc = exc.msg
|
||||||
|
while not ctx.setCancelled():
|
||||||
|
warn "waiting to cancel thread future!", fn = astToStr(fn)
|
||||||
|
await sleepAsync(10.milliseconds)
|
||||||
|
raise exc
|
||||||
|
finally:
|
||||||
|
discard ctx.signal.close()
|
||||||
|
self.semaphore.release()
|
||||||
|
|
||||||
proc hasTask[T, DB](ctx: ptr TaskCtx[T], ds: DB, key: KeyId) {.gcsafe.} =
|
proc hasTask[T, DB](ctx: ptr TaskCtx[T], ds: DB, key: KeyId) {.gcsafe.} =
|
||||||
## run backend command
|
## run backend command
|
||||||
executeTask(ctx):
|
executeTask(ctx):
|
||||||
@ -214,15 +214,18 @@ method close*(self: ThreadDatastore): Future[?!void] {.async.} =
|
|||||||
of Sqlite:
|
of Sqlite:
|
||||||
self.backend.sql.close()
|
self.backend.sql.close()
|
||||||
|
|
||||||
|
proc queryTask[DB](ctx: ptr TaskCtx, ds: DB;
|
||||||
|
key: DbQuery[KeyId]) {.gcsafe, nimcall.} =
|
||||||
|
## run backend command
|
||||||
|
executeTask(ctx):
|
||||||
|
let handle = ds.query(q)
|
||||||
|
query(ds, key)
|
||||||
|
|
||||||
method query*(
|
method query*(
|
||||||
self: ThreadDatastore,
|
self: ThreadDatastore,
|
||||||
query: Query): Future[?!QueryIter] {.async.} =
|
query: Query): Future[?!QueryIter] {.async.} =
|
||||||
without var childIter =? await self.ds.query(query), error:
|
|
||||||
return failure error
|
|
||||||
|
|
||||||
var
|
var
|
||||||
iter = QueryIter.new()
|
|
||||||
lock = newAsyncLock() # serialize querying under threads
|
lock = newAsyncLock() # serialize querying under threads
|
||||||
|
|
||||||
proc next(): Future[?!QueryResponse] {.async.} =
|
proc next(): Future[?!QueryResponse] {.async.} =
|
||||||
@ -242,9 +245,6 @@ method query*(
|
|||||||
iter.finished = childIter.finished
|
iter.finished = childIter.finished
|
||||||
var
|
var
|
||||||
res = ThreadResult[QueryResponse]()
|
res = ThreadResult[QueryResponse]()
|
||||||
ctx = TaskCtx[QueryResponse](
|
|
||||||
ds: self.ds,
|
|
||||||
res: addr res)
|
|
||||||
|
|
||||||
proc runTask() =
|
proc runTask() =
|
||||||
self.tp.spawn queryTask(addr ctx, addr childIter)
|
self.tp.spawn queryTask(addr ctx, addr childIter)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user