Fix Ref rewriting
This commit is contained in:
parent
697ef56a27
commit
829c0bf61a
|
@ -7,7 +7,7 @@ import ./syndicate/[actors, dataspaces, durings, patterns]
|
||||||
|
|
||||||
from ./syndicate/relays import connectStdio, connectUnix
|
from ./syndicate/relays import connectStdio, connectUnix
|
||||||
|
|
||||||
export Assertion, Facet, Handle, Ref, Turn, TurnAction, bootDataspace, `?`, connectStdio, connectUnix, drop, grab, publish, replace, run
|
export Assertion, Facet, Handle, Ref, Turn, TurnAction, bootDataspace, `?`, `$`, connectStdio, connectUnix, drop, grab, message, publish, replace, run
|
||||||
|
|
||||||
type
|
type
|
||||||
PublishProc = proc (turn: var Turn; v: Assertion; h: Handle) {.closure.}
|
PublishProc = proc (turn: var Turn; v: Assertion; h: Handle) {.closure.}
|
||||||
|
|
|
@ -336,8 +336,8 @@ proc terminate(facet; turn: var Turn; orderly: bool) {.gcsafe.} =
|
||||||
parent.get.children.excl facet
|
parent.get.children.excl facet
|
||||||
block:
|
block:
|
||||||
var turn = Turn(facet: facet, queues: turn.queues)
|
var turn = Turn(facet: facet, queues: turn.queues)
|
||||||
for child in facet.children:
|
while facet.children.len > 0:
|
||||||
child.terminate(turn, orderly)
|
facet.children.pop.terminate(turn, orderly)
|
||||||
if orderly:
|
if orderly:
|
||||||
for act in facet.shutdownActions:
|
for act in facet.shutdownActions:
|
||||||
act(turn)
|
act(turn)
|
||||||
|
|
|
@ -34,7 +34,8 @@ proc grab*(mem: Membrane; key: Oid|Ref): WireSymbol =
|
||||||
|
|
||||||
proc drop*(mem: var Membrane; sym: WireSymbol) =
|
proc drop*(mem: var Membrane; sym: WireSymbol) =
|
||||||
## Drop a `WireSymbol` from a `Membrane`.
|
## Drop a `WireSymbol` from a `Membrane`.
|
||||||
when not defined(release): assert sym.mem == mem
|
when not defined(release): assert sym.mem == mem,
|
||||||
|
"cannot drop WireSymbol at the wrong Membrane"
|
||||||
assert sym.count > 0
|
assert sym.count > 0
|
||||||
dec sym.count
|
dec sym.count
|
||||||
if sym.count < 1:
|
if sym.count < 1:
|
||||||
|
@ -43,7 +44,7 @@ proc drop*(mem: var Membrane; sym: WireSymbol) =
|
||||||
|
|
||||||
proc newWireSymbol*(mem: var Membrane; o: Oid; r: Ref): WireSymbol =
|
proc newWireSymbol*(mem: var Membrane; o: Oid; r: Ref): WireSymbol =
|
||||||
## Allocate a `WireSymbol` at a `Membrane`.
|
## Allocate a `WireSymbol` at a `Membrane`.
|
||||||
result = WireSymbol(oid: o, `ref`: r)
|
result = WireSymbol(oid: o, `ref`: r, count: 1)
|
||||||
when not defined(release): result.mem = mem
|
|
||||||
mem.byOid[result.oid] = result
|
mem.byOid[result.oid] = result
|
||||||
mem.byRef[result.`ref`] = result
|
mem.byRef[result.`ref`] = result
|
||||||
|
when not defined(release): result.mem = mem
|
||||||
|
|
|
@ -73,28 +73,28 @@ proc newSyncPeerEntity(r: Relay; p: Ref): SyncPeerEntity =
|
||||||
SyncPeerEntity(relay: r, peer: p)
|
SyncPeerEntity(relay: r, peer: p)
|
||||||
|
|
||||||
proc rewriteRefOut(relay: Relay; `ref`: Ref; transient: bool; exported: var seq[WireSymbol]): WireRef =
|
proc rewriteRefOut(relay: Relay; `ref`: Ref; transient: bool; exported: var seq[WireSymbol]): WireRef =
|
||||||
if `ref`.target of RelayEntity and `ref`.target.RelayEntity.relay == relay:
|
if `ref`.target of RelayEntity and `ref`.target.RelayEntity.relay == relay and `ref`.attenuation.len == 0:
|
||||||
trace "do the rewriteRefOut that wasn't being done before"
|
WireRef(orKind: WireRefKind.yours, yours: WireRefYours[Ref](oid: `ref`.target.oid))
|
||||||
result = WireRef(
|
|
||||||
orKind: WirerefKind.yours,
|
|
||||||
yours: WireRefYours[Ref](oid: `ref`.target.oid))
|
|
||||||
else:
|
else:
|
||||||
var ws = grab(relay.exported, `ref`)
|
var ws = grab(relay.exported, `ref`)
|
||||||
if ws.isNil:
|
if ws.isNil:
|
||||||
assert(not transient, "Cannot send transient reference")
|
doAssert(not transient, "Cannot send transient reference")
|
||||||
inc relay.nextLocalOid
|
|
||||||
ws = newWireSymbol(relay.exported, relay.nextLocalOid, `ref`)
|
ws = newWireSymbol(relay.exported, relay.nextLocalOid, `ref`)
|
||||||
|
inc relay.nextLocalOid
|
||||||
exported.add ws
|
exported.add ws
|
||||||
result = WireRef(
|
WireRef(
|
||||||
orKind: WireRefKind.mine,
|
orKind: WireRefKind.mine,
|
||||||
mine: WireRefMine(oid: ws.oid))
|
mine: WireRefMine(oid: ws.oid))
|
||||||
|
|
||||||
proc rewriteOut(relay: Relay; v: Assertion; transient: bool):
|
proc rewriteOut(relay: Relay; v: Assertion; transient: bool):
|
||||||
tuple[rewritten: WireAssertion, exported: seq[WireSymbol]] =
|
tuple[rewritten: WireAssertion, exported: seq[WireSymbol]] =
|
||||||
var exported: seq[WireSymbol]
|
var exported: seq[WireSymbol]
|
||||||
var rewritten = mapEmbeds[Ref, WireRef](v) do (r: Ref) -> WireRef:
|
result.rewritten = mapEmbeds[Ref, WireRef](v) do (r: Ref) -> WireRef:
|
||||||
result = rewriteRefOut(relay, r, transient, exported)
|
rewriteRefOut(relay, r, transient, exported)
|
||||||
(rewritten, exported)
|
result.exported = exported
|
||||||
|
|
||||||
|
proc register(relay: Relay; v: Assertion): WireAssertion =
|
||||||
|
rewriteOut(relay, v, false).rewritten
|
||||||
|
|
||||||
proc register(relay: Relay; v: Assertion; h: Handle): WireAssertion =
|
proc register(relay: Relay; v: Assertion; h: Handle): WireAssertion =
|
||||||
var (rewritten, exported) = rewriteOut(relay, v, false)
|
var (rewritten, exported) = rewriteOut(relay, v, false)
|
||||||
|
@ -138,11 +138,8 @@ method retract(re: RelayEntity; t: var Turn; h: Handle) =
|
||||||
retract: Retract(handle: h))
|
retract: Retract(handle: h))
|
||||||
|
|
||||||
method message(re: RelayEntity; turn: var Turn; msg: Assertion) =
|
method message(re: RelayEntity; turn: var Turn; msg: Assertion) =
|
||||||
var
|
re.send Event(orKind: EventKind.Message,
|
||||||
ev = Event(orKind: EventKind.Message)
|
message: Message[WireRef](body: register(re.relay, msg)))
|
||||||
(body, _) = rewriteOut(re.relay, msg, true)
|
|
||||||
ev.message = Message[WireRef](body: body)
|
|
||||||
re.send ev
|
|
||||||
|
|
||||||
method sync(re: RelayEntity; turn: var Turn; peer: Ref) =
|
method sync(re: RelayEntity; turn: var Turn; peer: Ref) =
|
||||||
var
|
var
|
||||||
|
|
Loading…
Reference in New Issue