diff --git a/src/syndicate.nim b/src/syndicate.nim index 05ef5c4..07f233b 100644 --- a/src/syndicate.nim +++ b/src/syndicate.nim @@ -196,29 +196,21 @@ macro during*(ds: Cap; pattern: Pattern; publishBody: untyped) = discard observe(activeTurn(), `ds`, `pattern`, during(`callbackSym`)) ]# -type BootProc = proc (ds: Cap) - -#[ -proc runActor*(name: string; bootProc: BootProc) = - ## Run an `Actor` to completion. - let actor = newActor(name) - let actor = bootDataspace(name, bootProc) - while actor.running: - ioqueue.run() - -proc runActor*(name: string; bootProc: DeprecatedBootProc) {.deprecated.} = - ## Run an `Actor` to completion. - 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`(cont: Cont): Cont {.cpsMagic.} = + proc `sym`() = `body` - nil +macro onStop*(body: untyped) = + let + handlerDef = wrapHandler(body, "onStop") + handlerSym = handlerDef[0] + result = quote do: + `handlerDef` + addOnStopHandler(`handlerSym`) + +#[ macro onStop*(body: untyped) = quote do: block: @@ -227,3 +219,4 @@ macro onStop*(body: untyped) = if facet.stopped(): `body` return +]# diff --git a/src/syndicate/actors.nim b/src/syndicate/actors.nim index 1bcf4b1..2fbee13 100644 --- a/src/syndicate/actors.nim +++ b/src/syndicate/actors.nim @@ -28,12 +28,15 @@ type FacetState = enum fFresh, fRunning, fEnded + Callback* = proc () {.nimcall.} + Facet* = ref object ## https://synit.org/book/glossary.html#facet actor: Actor parent: Facet children: seq[Facet] stopHandlers: HandlerDeque + stopCallbacks: seq[Callback] state: FacetState when traceSyndicate: id: FacetId @@ -221,6 +224,9 @@ proc stop(turn; facet; reason: FacetStopReason) = var c = whelp runNextFacetStop() c.facet = facet complete(turn, c) + while facet.stopCallbacks.len > 0: + var cb = facet.stopCallbacks.pop() + cb() while facet.children.len > 0: stop(turn, facet.children.pop(), FacetStopReason.parentStopping) when traceSyndicate: @@ -335,3 +341,7 @@ proc sync*(cap: Cap) {.syndicate.} = proc installStopHook*(c: Cont, facet: Facet): Cont {.cpsMagic.} = facet.stopHandlers.add(c.fn) return c + +proc addOnStopHandler*(c: Cont; cb: Callback): Cont {.cpsMagic.} = + c.facet.stopCallbacks.add(cb) + result = c