From 50b00827ce5a1a0f4b38fc7a71e5312bf61e2824 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Fri, 15 Mar 2024 10:20:27 +0000 Subject: [PATCH] Adjust actor API --- src/syndicate.nim | 5 ----- src/syndicate/actors.nim | 26 +++++++++++++++++++------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/syndicate.nim b/src/syndicate.nim index 8ca3787..05109ef 100644 --- a/src/syndicate.nim +++ b/src/syndicate.nim @@ -188,8 +188,3 @@ macro during*(turn: untyped; ds: Cap; pattern: Pattern; publishBody: untyped) = `callbackProc` discard inFacet(`turn`) do (`turn`: var Turn): discard observe(`turn`, `ds`, `pattern`, during(`callbackSym`)) - -proc runActor*(name: string; bootProc: TurnAction) = - ## Boot an actor `Actor` and churn ioqueue once. - discard bootActor(name, bootProc) - actors.run() diff --git a/src/syndicate/actors.nim b/src/syndicate/actors.nim index 79ca1c6..2638055 100644 --- a/src/syndicate/actors.nim +++ b/src/syndicate/actors.nim @@ -704,17 +704,20 @@ proc run(turn: var Turn) = turnQueue.addLast(move eff) turn.facet = nil # invalidate the turn +proc runPendingTurns* = + while turnQueue.len > 0: + var turn = turnQueue.popFirst() + # TODO: check if actor is still valid + try: run(turn) + except CatchableError as err: + stderr.writeLine("actor ", turn.actor.name, " threw an error during a turn") + terminateActor(turn, err) + proc run* = ## Run actors to completion var ready: seq[Continuation] while true: - while turnQueue.len > 0: - var turn = turnQueue.popFirst() - # TODO: check if actor is still valid - try: run(turn) - except CatchableError as err: - stderr.writeLine("actor ", turn.actor.name, " threw an error during a turn") - terminateActor(turn, err) + runPendingTurns() ioqueue.poll(ready) if ready.len == 0: break while ready.len > 0: @@ -725,6 +728,15 @@ proc run* = stderr.writeLine "ioqueue continuation threw an error" raise err +proc runActor*(name: string; bootProc: TurnAction) = + ## Boot an actor `Actor` and churn ioqueue. + let actor = bootActor(name, bootProc) + if not actor.exitReason.isNil: + raise actor.exitReason + actors.run() + if not actor.exitReason.isNil: + raise actor.exitReason + type FacetGuard* = object facet: Facet