Handler attempt
This commit is contained in:
parent
b2f680a215
commit
b83ef93484
|
@ -4,6 +4,7 @@
|
|||
## This module implements the `Syndicate DSL <https://syndicate-lang.org/doc/syndicate/>`_.
|
||||
|
||||
import std/[macros, tables, typetraits]
|
||||
import pkg/cps
|
||||
# import pkg/sys/ioqueue
|
||||
|
||||
import preserves
|
||||
|
@ -206,3 +207,17 @@ proc runActor*(name: string; bootProc: DeprecatedBootProc) {.deprecated.} =
|
|||
runActor(name) do (turn: Turn, ds: Cap):
|
||||
bootProc(ds, turn)
|
||||
]#
|
||||
|
||||
proc wrapHandler(body: NimNode; ident: string): NimNode =
|
||||
var sym = genSym(nskProc, ident)
|
||||
quote do:
|
||||
proc `sym`() =
|
||||
`body`
|
||||
|
||||
macro onStop*(body: untyped) =
|
||||
let
|
||||
handler = wrapHandler(body, "onStop")
|
||||
handlerSym = handler[0]
|
||||
quote do:
|
||||
`handler`
|
||||
addStopHandler(activeActor(), `handlerSym`)
|
||||
|
|
|
@ -17,25 +17,32 @@ when traceSyndicate:
|
|||
export protocol.Handle
|
||||
|
||||
type
|
||||
Actor* = ref object
|
||||
## https://synit.org/book/glossary.html#actor
|
||||
root: Facet
|
||||
handleAllocator: Handle
|
||||
id: ActorId
|
||||
when traceSyndicate:
|
||||
traceStream: FileStream
|
||||
stopped: bool
|
||||
Cont* = ref object of Continuation
|
||||
turn: Turn
|
||||
|
||||
Handler* = proc() {.closure.}
|
||||
|
||||
Work = Deque[Cont]
|
||||
|
||||
FacetState = enum fIdle, fRunning, fStopped
|
||||
|
||||
Facet* = ref object
|
||||
## https://synit.org/book/glossary.html#facet
|
||||
actor: Actor
|
||||
parent: Facet
|
||||
stopHandlers: Work
|
||||
state: FacetState
|
||||
stopHandlers: Deque[Handler]
|
||||
# state: FacetState
|
||||
when traceSyndicate:
|
||||
id: FacetId
|
||||
|
||||
FacetState = enum fIdle, fRunning, fStopped
|
||||
Turn* = ref object
|
||||
## https://synit.org/book/glossary.html#turn
|
||||
facet: Facet
|
||||
entity: Entity
|
||||
event: Option[protocol.Event]
|
||||
work: Work
|
||||
when traceSyndicate:
|
||||
desc: TurnDescription
|
||||
|
||||
Entity* = ref object of RootObj
|
||||
## https://synit.org/book/glossary.html#entity
|
||||
|
@ -49,19 +56,16 @@ type
|
|||
target*: Entity
|
||||
attenuation*: seq[sturdy.Caveat]
|
||||
|
||||
Turn* = ref object
|
||||
## https://synit.org/book/glossary.html#turn
|
||||
facet: Facet
|
||||
entity: Entity
|
||||
event: Option[protocol.Event]
|
||||
work: Work
|
||||
Actor* = ref object
|
||||
## https://synit.org/book/glossary.html#actor
|
||||
# crashHandlers: Deque[Handler]
|
||||
root: Facet
|
||||
handleAllocator: Handle
|
||||
facetIdAllocator: int
|
||||
id: ActorId
|
||||
when traceSyndicate:
|
||||
desc: TurnDescription
|
||||
|
||||
Work = Deque[Cont]
|
||||
|
||||
Cont* = ref object of Continuation
|
||||
turn: Turn
|
||||
traceStream: FileStream
|
||||
stopped: bool
|
||||
|
||||
using
|
||||
actor: Actor
|
||||
|
@ -74,14 +78,12 @@ proc hash*(facet): Hash = facet.unsafeAddr.hash
|
|||
proc hash*(cap): Hash = cap.unsafeAddr.hash
|
||||
|
||||
proc newFacet(actor: Actor; parent: Facet): Facet =
|
||||
inc(actor.facetIdAllocator)
|
||||
result = Facet(
|
||||
actor: actor,
|
||||
parent: parent,
|
||||
id: actor.facetIdAllocator.toPreserves,
|
||||
)
|
||||
when traceSyndicate:
|
||||
if not parent.isNil:
|
||||
result.id = parent.id
|
||||
inc(result.id.register)
|
||||
|
||||
proc newActor(name: string): Actor =
|
||||
result = Actor(id: name.toPreserves)
|
||||
|
@ -126,9 +128,7 @@ when traceSyndicate:
|
|||
)
|
||||
|
||||
proc newExternalTurn(facet): Turn =
|
||||
result = Turn(
|
||||
facet: facet,
|
||||
)
|
||||
result = Turn(facet: facet)
|
||||
when traceSyndicate:
|
||||
result.desc = TurnDescription(cause: TurnCause(orKind: TurnCauseKind.external))
|
||||
|
||||
|
@ -170,6 +170,11 @@ proc run(turn) =
|
|||
if actor.stopped:
|
||||
trace(actor, ActorActivation(orkind: ActorActivationKind.stop))
|
||||
|
||||
proc run(handlers: var Deque[Handler]) =
|
||||
while handlers.len > 0:
|
||||
var h = handlers.popLast()
|
||||
h()
|
||||
|
||||
proc start(actor; cont: Cont) =
|
||||
when traceSyndicate:
|
||||
var act = ActorActivation(orkind: ActorActivationKind.start)
|
||||
|
@ -186,7 +191,7 @@ proc collectPath(result: var seq[FacetId]; facet) =
|
|||
result.add(facet.id)
|
||||
|
||||
proc stop(turn; facet; reason: FacetStopReason) =
|
||||
run(facet, facet.stopHandlers)
|
||||
run(facet.stopHandlers)
|
||||
when traceSyndicate:
|
||||
var act = ActionDescription(orKind: ActionDescriptionKind.facetstop)
|
||||
collectPath(act.facetstop.path, facet)
|
||||
|
@ -313,3 +318,6 @@ proc message*(cap: Cap; val: Value) {.syndicate.} =
|
|||
|
||||
proc sync*(cap: Cap) {.syndicate.} =
|
||||
activeTurn().sync(cap)
|
||||
|
||||
proc addStopHandler*(actor: Actor; h: Handler) =
|
||||
actor.root.stopHandlers.addLast(h)
|
||||
|
|
|
@ -17,7 +17,7 @@ proc main() {.syndicate.} =
|
|||
sync(ds)
|
||||
|
||||
onStop:
|
||||
echo "onStop body is executing"
|
||||
echo "anonymous stop handler was invoked"
|
||||
|
||||
echo "stopping actor"
|
||||
stopActor()
|
||||
|
@ -38,4 +38,5 @@ proc main() {.syndicate.} =
|
|||
stopActor()
|
||||
]#
|
||||
|
||||
|
||||
bootActor("main", whelp main())
|
||||
|
|
Loading…
Reference in New Issue