From 4b29fc009b95f06c494eb60b1609a3a4859576b1 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Sat, 22 Jul 2023 11:32:52 +0100 Subject: [PATCH] Return an Actor from spawn --- src/syndicate.nim | 2 +- src/syndicate/actors.nim | 16 ++++++++-------- src/syndicate/actors/timers.nim | 2 +- src/syndicate/relays.nim | 2 +- syndicate.nimble | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/syndicate.nim b/src/syndicate.nim index 980c6fa..12d6f9d 100644 --- a/src/syndicate.nim +++ b/src/syndicate.nim @@ -20,7 +20,7 @@ export patterns export Actor, Assertion, Facet, Handle, Ref, Symbol, Turn, TurnAction, `$`, addCallback, analyse, asyncCheck, bootDataspace, facet, future, inFacet, message, newDataspace, onStop, publish, - retract, replace, run, stop, unembed, unpackLiterals + retract, replace, run, spawn, stop, unembed, unpackLiterals proc `!`*(typ: static typedesc): Pattern {.inline.} = patterns.dropType(typ) diff --git a/src/syndicate/actors.nim b/src/syndicate/actors.nim index 3c81d78..d19b68c 100644 --- a/src/syndicate/actors.nim +++ b/src/syndicate/actors.nim @@ -428,14 +428,15 @@ proc inFacet*(turn: var Turn; bootProc: TurnAction): Facet = proc facet*(turn: var Turn; bootProc: TurnAction): Facet {.deprecated.} = inFacet(turn, bootProc) -proc newActor(name: string): Actor = +proc newActor(name: string; handleAlloc: ref Handle): Actor = let now = getTime() seed = now.toUnix * 1_000_000_000 + now.nanosecond result = Actor( name: name, - id: ActorId(seed)) - new result.handleAllocator + id: ActorId(seed), + handleAllocator: handleAlloc, + ) result.root = newFacet(result, nil) result.future = newFuture[void]($result) when tracing: @@ -449,8 +450,7 @@ proc run(actor; bootProc: TurnAction; initialAssertions: OutboundTable) = proc bootActor*(name: string; bootProc: TurnAction): Actor = var initialAssertions: OutboundTable - result = newActor(name) - new result.handleAllocator + result = newActor(name, new(ref Handle)) when tracing: new result.turnIdAllocator let path = getEnv("SYNDICATE_TRACE_FILE", "/tmp/" & name & ".trace.pr") @@ -460,13 +460,12 @@ proc bootActor*(name: string; bootProc: TurnAction): Actor = else: result.traceStream = openFileStream(path, fmWrite) run(result, bootProc, initialAssertions) -proc spawn*(name: string; turn: var Turn; bootProc: TurnAction; initialAssertions = initHashSet[Handle]()) = +proc spawn*(name: string; turn: var Turn; bootProc: TurnAction; initialAssertions = initHashSet[Handle]()): Actor = + let actor = newActor(name, turn.facet.actor.handleAllocator) enqueue(turn, turn.facet) do (turn: var Turn): var newOutBound: Table[Handle, OutboundAssertion] for key in initialAssertions: discard turn.facet.outbound.pop(key, newOutbound[key]) - let actor = newActor(name) - actor.handleAllocator = turn.facet.actor.handleAllocator when tracing: actor.turnIdAllocator = turn.facet.actor.turnIdAllocator actor.traceStream = turn.facet.actor.traceStream @@ -474,6 +473,7 @@ proc spawn*(name: string; turn: var Turn; bootProc: TurnAction; initialAssertion act.spawn.id = actor.id.toPreserve turn.desc.actions.add act run(actor, bootProc, newOutBound) + actor proc newInertRef*(): Ref = let a = bootActor("inert") do (turn: var Turn): turn.stop() diff --git a/src/syndicate/actors/timers.nim b/src/syndicate/actors/timers.nim index 480fac8..5d61bf1 100644 --- a/src/syndicate/actors/timers.nim +++ b/src/syndicate/actors/timers.nim @@ -14,7 +14,7 @@ type Observe = dataspace.Observe[Ref] proc now: float64 = getTime().toUnixFloat() -proc spawnTimers*(turn: var Turn; ds: Ref) = +proc spawnTimers*(turn: var Turn; ds: Ref): Actor {.discardable.} = ## Spawn a timer actor. spawn("timer", turn) do (turn: var Turn): diff --git a/src/syndicate/relays.nim b/src/syndicate/relays.nim index 3d2a03b..b3d8d46 100644 --- a/src/syndicate/relays.nim +++ b/src/syndicate/relays.nim @@ -265,7 +265,7 @@ proc newRelay(turn: var Turn; opts: RelayOptions; setup: RelaySetup): Relay = proc spawnRelay*(name: string; turn: var Turn; opts: RelayActorOptions; setup: RelaySetup): Future[Ref] = var fut = newFuture[Ref]"spawnRelay" - spawn(name, turn) do (turn: var Turn): + discard spawn(name, turn) do (turn: var Turn): let relay = newRelay(turn, opts, setup) if not opts.initialRef.isNil: var exported: seq[WireSymbol] diff --git a/syndicate.nimble b/syndicate.nimble index 7ffd4e5..adec026 100644 --- a/syndicate.nimble +++ b/syndicate.nimble @@ -1,6 +1,6 @@ # Package -version = "20230721" +version = "20230722" author = "Emery Hemingway" description = "Syndicated actors for conversational concurrency" license = "Unlicense" @@ -9,4 +9,4 @@ srcDir = "src" # Dependencies -requires "hashlib", "nim >= 1.4.8", "preserves >= 20230530", "taps >= 20221119" +requires "hashlib", "nim >= 1.4.8", "preserves >= 20230720", "taps >= 20221119"