Actors lineages share a handle allocator

For multiple actors to communicate through the same relay they
must use unique assertion handles.
This commit is contained in:
Emery Hemingway 2023-07-12 15:16:20 +01:00
parent b1b0477b8a
commit 91a218f7fb
1 changed files with 8 additions and 4 deletions

View File

@ -43,7 +43,9 @@ type
future: Future[void]
name: string
id: ActorId
handleAllocator: Handle
handleAllocator: ref Handle
# a fresh actor gets a new ref Handle and
# all actors spawned from it get the same ref.
root: Facet
exitReason: ref Exception
exitHooks: seq[TurnAction]
@ -119,8 +121,8 @@ proc hash*(facet): Hash =
proc hash*(r: Ref): Hash = !$(r.relay.hash !& r.target.unsafeAddr.hash)
proc nextHandle(facet: Facet): Handle =
inc facet.actor.handleAllocator
facet.actor.handleAllocator
result = succ(facet.actor.handleAllocator[])
facet.actor.handleAllocator[] = result
proc facet*(turn: var Turn): Facet = turn.facet
@ -382,6 +384,7 @@ proc newActor(name: string; bootProc: TurnAction; initialAssertions: OutboundTab
result = Actor(
name: name,
id: ActorId(seed))
new result.handleAllocator
result.root = newFacet(result, none Facet)
result.future = newFuture[void]($result)
run(
@ -397,7 +400,8 @@ proc spawn*(name: string; turn: var Turn; bootProc: TurnAction; initialAssertion
var newOutBound: Table[Handle, OutboundAssertion]
for key in initialAssertions:
discard turn.facet.outbound.pop(key, newOutbound[key])
discard newActor(name, bootProc, newOutBound)
let actor = newActor(name, bootProc, newOutBound)
actor.handleAllocator = turn.facet.actor.handleAllocator
proc newInertRef*(): Ref =
let a = bootActor("inert") do (turn: var Turn): turn.stop()