mirror of
https://github.com/logos-storage/apatheia.git
synced 2026-05-20 07:49:32 +00:00
format all
This commit is contained in:
parent
d417cdec04
commit
1dfdbe8e1f
@ -1,3 +1,2 @@
|
|||||||
|
|
||||||
import apatheia/tasks
|
import apatheia/tasks
|
||||||
export tasks
|
export tasks
|
||||||
|
|||||||
@ -159,8 +159,7 @@ when isMainModule:
|
|||||||
var tp = Taskpool.new(num_threads = 2) # Default to the number of hardware threads.
|
var tp = Taskpool.new(num_threads = 2) # Default to the number of hardware threads.
|
||||||
|
|
||||||
asyncTest "basic openarray":
|
asyncTest "basic openarray":
|
||||||
var
|
var jobs = newJobQueue[float](taskpool = tp)
|
||||||
jobs = newJobQueue[float](taskpool = tp)
|
|
||||||
|
|
||||||
let job = jobs.submit(addNumValues(10.0, @[1.0.float, 2.0]))
|
let job = jobs.submit(addNumValues(10.0, @[1.0.float, 2.0]))
|
||||||
let res = await job
|
let res = await job
|
||||||
|
|||||||
@ -3,22 +3,19 @@ import std/[tables, strutils, typetraits, macros]
|
|||||||
proc makeProcName*(s: string): string =
|
proc makeProcName*(s: string): string =
|
||||||
result = ""
|
result = ""
|
||||||
for c in s:
|
for c in s:
|
||||||
if c.isAlphaNumeric: result.add c
|
if c.isAlphaNumeric:
|
||||||
|
result.add c
|
||||||
|
|
||||||
proc hasReturnType*(params: NimNode): bool =
|
proc hasReturnType*(params: NimNode): bool =
|
||||||
if params != nil and params.len > 0 and params[0] != nil and
|
if params != nil and params.len > 0 and params[0] != nil and params[0].kind != nnkEmpty:
|
||||||
params[0].kind != nnkEmpty:
|
|
||||||
result = true
|
result = true
|
||||||
|
|
||||||
proc getReturnType*(params: NimNode): NimNode =
|
proc getReturnType*(params: NimNode): NimNode =
|
||||||
if params != nil and params.len > 0 and params[0] != nil and
|
if params != nil and params.len > 0 and params[0] != nil and params[0].kind != nnkEmpty:
|
||||||
params[0].kind != nnkEmpty:
|
|
||||||
result = params[0]
|
result = params[0]
|
||||||
|
|
||||||
proc firstArgument*(params: NimNode): (NimNode, NimNode) =
|
proc firstArgument*(params: NimNode): (NimNode, NimNode) =
|
||||||
if params != nil and
|
if params != nil and params.len > 0 and params[1] != nil and
|
||||||
params.len > 0 and
|
|
||||||
params[1] != nil and
|
|
||||||
params[1].kind == nnkIdentDefs:
|
params[1].kind == nnkIdentDefs:
|
||||||
result = (ident params[1][0].strVal, params[1][1])
|
result = (ident params[1][0].strVal, params[1][1])
|
||||||
else:
|
else:
|
||||||
@ -29,15 +26,13 @@ iterator paramsIter*(params: NimNode): tuple[name, ntype: NimNode] =
|
|||||||
for i in 1 ..< params.len:
|
for i in 1 ..< params.len:
|
||||||
let arg = params[i]
|
let arg = params[i]
|
||||||
let argType = arg[^2]
|
let argType = arg[^2]
|
||||||
for j in 0 ..< arg.len-2:
|
for j in 0 ..< arg.len - 2:
|
||||||
yield (arg[j], argType)
|
yield (arg[j], argType)
|
||||||
|
|
||||||
proc signalTuple*(sig: NimNode): NimNode =
|
proc signalTuple*(sig: NimNode): NimNode =
|
||||||
let otp = nnkEmpty.newTree()
|
let otp = nnkEmpty.newTree()
|
||||||
# echo "signalObjRaw:sig1: ", sig.treeRepr
|
# echo "signalObjRaw:sig1: ", sig.treeRepr
|
||||||
let sigTyp =
|
let sigTyp = if sig.kind == nnkSym: sig.getTypeInst else: sig.getTypeInst
|
||||||
if sig.kind == nnkSym: sig.getTypeInst
|
|
||||||
else: sig.getTypeInst
|
|
||||||
# echo "signalObjRaw:sig2: ", sigTyp.treeRepr
|
# echo "signalObjRaw:sig2: ", sigTyp.treeRepr
|
||||||
let stp =
|
let stp =
|
||||||
if sigTyp.kind == nnkProcTy:
|
if sigTyp.kind == nnkProcTy:
|
||||||
@ -52,14 +47,16 @@ proc signalTuple*(sig: NimNode): NimNode =
|
|||||||
# echo "signalObjRaw:sig: ", stp.repr
|
# echo "signalObjRaw:sig: ", stp.repr
|
||||||
|
|
||||||
var args: seq[NimNode]
|
var args: seq[NimNode]
|
||||||
for i in 2..<stp.len:
|
for i in 2 ..< stp.len:
|
||||||
args.add stp[i]
|
args.add stp[i]
|
||||||
|
|
||||||
result = nnkTupleConstr.newTree()
|
result = nnkTupleConstr.newTree()
|
||||||
if isGeneric:
|
if isGeneric:
|
||||||
template genArgs(n): auto = n[1][1]
|
template genArgs(n): auto =
|
||||||
|
n[1][1]
|
||||||
|
|
||||||
var genKinds: Table[string, NimNode]
|
var genKinds: Table[string, NimNode]
|
||||||
for i in 1..<stp.genArgs.len:
|
for i in 1 ..< stp.genArgs.len:
|
||||||
genKinds[repr stp.genArgs[i]] = otp[i]
|
genKinds[repr stp.genArgs[i]] = otp[i]
|
||||||
for arg in args:
|
for arg in args:
|
||||||
result.add genKinds[arg[1].repr]
|
result.add genKinds[arg[1].repr]
|
||||||
@ -72,19 +69,20 @@ proc signalTuple*(sig: NimNode): NimNode =
|
|||||||
# echo ""
|
# echo ""
|
||||||
if result.len == 0:
|
if result.len == 0:
|
||||||
# result = bindSym"void"
|
# result = bindSym"void"
|
||||||
result = quote do:
|
result = quote:
|
||||||
tuple[]
|
tuple[]
|
||||||
|
|
||||||
proc mkParamsVars*(paramsIdent, paramsType, params: NimNode): NimNode =
|
proc mkParamsVars*(paramsIdent, paramsType, params: NimNode): NimNode =
|
||||||
## Create local variables for each parameter in the actual RPC call proc
|
## Create local variables for each parameter in the actual RPC call proc
|
||||||
if params.isNil: return
|
if params.isNil:
|
||||||
|
return
|
||||||
|
|
||||||
result = newStmtList()
|
result = newStmtList()
|
||||||
var varList = newSeq[NimNode]()
|
var varList = newSeq[NimNode]()
|
||||||
var cnt = 0
|
var cnt = 0
|
||||||
for paramid, paramType in paramsIter(params):
|
for paramid, paramType in paramsIter(params):
|
||||||
let idx = newIntLitNode(cnt)
|
let idx = newIntLitNode(cnt)
|
||||||
let vars = quote do:
|
let vars = quote:
|
||||||
var `paramid`: `paramType` = `paramsIdent`[`idx`]
|
var `paramid`: `paramType` = `paramsIdent`[`idx`]
|
||||||
varList.add vars
|
varList.add vars
|
||||||
cnt.inc()
|
cnt.inc()
|
||||||
@ -106,9 +104,10 @@ proc mkParamsType*(paramsIdent, paramsType, params, genericParams: NimNode): Nim
|
|||||||
##
|
##
|
||||||
## proc multiplyrpc(params: RpcType_multiplyrpc): int =
|
## proc multiplyrpc(params: RpcType_multiplyrpc): int =
|
||||||
##
|
##
|
||||||
if params.isNil: return
|
if params.isNil:
|
||||||
|
return
|
||||||
|
|
||||||
var tup = quote do:
|
var tup = quote:
|
||||||
type `paramsType` = tuple[]
|
type `paramsType` = tuple[]
|
||||||
for paramIdent, paramType in paramsIter(params):
|
for paramIdent, paramType in paramsIter(params):
|
||||||
# processing multiple variables of one type
|
# processing multiple variables of one type
|
||||||
@ -129,7 +128,8 @@ proc procIdentAppend*(id: NimNode, name: string): NimNode =
|
|||||||
|
|
||||||
proc mkCall*(callName, params: NimNode): NimNode =
|
proc mkCall*(callName, params: NimNode): NimNode =
|
||||||
## Create local variables for each parameter in the actual RPC call proc
|
## Create local variables for each parameter in the actual RPC call proc
|
||||||
if params.isNil: return
|
if params.isNil:
|
||||||
|
return
|
||||||
var argList = newSeq[NimNode]()
|
var argList = newSeq[NimNode]()
|
||||||
for paramId, paramType in paramsIter(params):
|
for paramId, paramType in paramsIter(params):
|
||||||
argList.add paramId
|
argList.add paramId
|
||||||
@ -138,9 +138,10 @@ proc mkCall*(callName, params: NimNode): NimNode =
|
|||||||
|
|
||||||
proc mkProc*(name, params, body: NimNode): NimNode =
|
proc mkProc*(name, params, body: NimNode): NimNode =
|
||||||
let args = params.copyNimTree()
|
let args = params.copyNimTree()
|
||||||
result = quote do:
|
result = quote:
|
||||||
proc `name`() {.nimcall.} =
|
proc `name`() {.nimcall.} =
|
||||||
`body`
|
`body`
|
||||||
|
|
||||||
result[3].del(0)
|
result[3].del(0)
|
||||||
for arg in args:
|
for arg in args:
|
||||||
result.params.add arg
|
result.params.add arg
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
import std/tables
|
import std/tables
|
||||||
|
|
||||||
import ./types
|
import ./types
|
||||||
|
|||||||
@ -10,23 +10,23 @@ export options
|
|||||||
export threadsync
|
export threadsync
|
||||||
export chronos
|
export chronos
|
||||||
|
|
||||||
type
|
type ChanPtr[T] = ptr Channel[T]
|
||||||
ChanPtr[T] = ptr Channel[T]
|
|
||||||
|
|
||||||
proc allocSharedChannel[T](): ChanPtr[T] =
|
proc allocSharedChannel[T](): ChanPtr[T] =
|
||||||
cast[ChanPtr[T]](allocShared0(sizeof(Channel[T])))
|
cast[ChanPtr[T]](allocShared0(sizeof(Channel[T])))
|
||||||
|
|
||||||
type
|
type SignalQueue*[T] = object
|
||||||
SignalQueue*[T] = object
|
signal: ThreadSignalPtr
|
||||||
signal: ThreadSignalPtr
|
chan*: ChanPtr[T]
|
||||||
chan*: ChanPtr[T]
|
|
||||||
|
|
||||||
proc dispose*[T](val: SignalQueue[T]) =
|
proc dispose*[T](val: SignalQueue[T]) =
|
||||||
## Call to properly dispose of a SignalQueue.
|
## Call to properly dispose of a SignalQueue.
|
||||||
deallocShared(val.chan)
|
deallocShared(val.chan)
|
||||||
discard val.signal.close()
|
discard val.signal.close()
|
||||||
|
|
||||||
proc newSignalQueue*[T](maxItems: int = 0): SignalQueue[T] {.raises: [ApatheiaSignalErr].} =
|
proc newSignalQueue*[T](
|
||||||
|
maxItems: int = 0
|
||||||
|
): SignalQueue[T] {.raises: [ApatheiaSignalErr].} =
|
||||||
## Create a signal queue compatible with Chronos async.
|
## Create a signal queue compatible with Chronos async.
|
||||||
let res = ThreadSignalPtr.new()
|
let res = ThreadSignalPtr.new()
|
||||||
if res.isErr():
|
if res.isErr():
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
import std/[macros, strutils]
|
import std/[macros, strutils]
|
||||||
|
|
||||||
import macroutils
|
import macroutils
|
||||||
@ -30,30 +29,30 @@ macro asyncTask*(p: untyped): untyped =
|
|||||||
# pragmas = p[4]
|
# pragmas = p[4]
|
||||||
body = p[6]
|
body = p[6]
|
||||||
name = repr(procId).strip(false, true, {'*'})
|
name = repr(procId).strip(false, true, {'*'})
|
||||||
|
|
||||||
if not hasReturnType(params):
|
if not hasReturnType(params):
|
||||||
error("tasklet definition must have return type", p)
|
error("tasklet definition must have return type", p)
|
||||||
|
|
||||||
# setup inner tasklet proc
|
# setup inner tasklet proc
|
||||||
let tp = mkProc(procId.procIdentAppend("Tasklet"),
|
let tp = mkProc(procId.procIdentAppend("Tasklet"), params, body)
|
||||||
params, body)
|
|
||||||
|
|
||||||
# setup async wrapper code
|
# setup async wrapper code
|
||||||
var asyncBody = newStmtList()
|
var asyncBody = newStmtList()
|
||||||
let tcall = newCall(ident(name & "Tasklet"))
|
let tcall = newCall(ident(name & "Tasklet"))
|
||||||
for paramId, paramType in paramsIter(params):
|
for paramId, paramType in paramsIter(params):
|
||||||
tcall.add newCall("checkParamType", paramId)
|
tcall.add newCall("checkParamType", paramId)
|
||||||
asyncBody = quote do:
|
asyncBody = quote:
|
||||||
let val {.inject.} = `tcall`
|
let val {.inject.} = `tcall`
|
||||||
discard jobResult.queue.send((jobResult.id, val,))
|
discard jobResult.queue.send((jobResult.id, val))
|
||||||
|
|
||||||
var asyncParams = params.copyNimTree()
|
var asyncParams = params.copyNimTree()
|
||||||
let retType = if not hasReturnType(params): ident"void"
|
let retType =
|
||||||
else: params.getReturnType()
|
if not hasReturnType(params):
|
||||||
|
ident"void"
|
||||||
|
else:
|
||||||
|
params.getReturnType()
|
||||||
let jobArg = nnkIdentDefs.newTree(
|
let jobArg = nnkIdentDefs.newTree(
|
||||||
ident"jobResult",
|
ident"jobResult", nnkBracketExpr.newTree(ident"JobResult", retType), newEmptyNode()
|
||||||
nnkBracketExpr.newTree(ident"JobResult", retType),
|
|
||||||
newEmptyNode()
|
|
||||||
)
|
)
|
||||||
asyncParams[0] = newEmptyNode()
|
asyncParams[0] = newEmptyNode()
|
||||||
asyncParams.insert(1, jobArg)
|
asyncParams.insert(1, jobArg)
|
||||||
@ -67,13 +66,8 @@ macro asyncTask*(p: untyped): untyped =
|
|||||||
echo "asyncTask:body:\n", result.repr
|
echo "asyncTask:body:\n", result.repr
|
||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
|
type HashOptions* = object
|
||||||
|
striped*: bool
|
||||||
|
|
||||||
type
|
proc doHashes2*(data: openArray[byte], opts: HashOptions): float {.asyncTask.} =
|
||||||
HashOptions* = object
|
|
||||||
striped*: bool
|
|
||||||
|
|
||||||
proc doHashes2*(data: openArray[byte],
|
|
||||||
opts: HashOptions): float {.asyncTask.} =
|
|
||||||
echo "hashing"
|
echo "hashing"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
|
|
||||||
type
|
type
|
||||||
ApatheiaException* = object of CatchableError
|
ApatheiaException* = object of CatchableError
|
||||||
ApatheiaSignalErr* = object of ApatheiaException
|
ApatheiaSignalErr* = object of ApatheiaException
|
||||||
|
|
||||||
JobId* = uint ## job id, should match `future.id()`
|
JobId* = uint ## job id, should match `future.id()`
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user