Make sync work
This commit is contained in:
parent
0e5637a6c3
commit
6b642645f9
|
@ -325,7 +325,6 @@ proc message*[T](turn: var Turn; r: Cap; v: T) =
|
||||||
|
|
||||||
proc sync(turn: var Turn; e: Entity; peer: Cap) =
|
proc sync(turn: var Turn; e: Entity; peer: Cap) =
|
||||||
e.sync(turn, peer)
|
e.sync(turn, peer)
|
||||||
# or turn.message(peer, true) ?
|
|
||||||
|
|
||||||
proc sync*(turn: var Turn; r, peer: Cap) =
|
proc sync*(turn: var Turn; r, peer: Cap) =
|
||||||
enqueue(turn, r.relay) do (turn: var Turn):
|
enqueue(turn, r.relay) do (turn: var Turn):
|
||||||
|
@ -595,8 +594,15 @@ proc newCap*(relay: Facet; e: Entity): Cap =
|
||||||
proc newCap*(turn; e: Entity): Cap =
|
proc newCap*(turn; e: Entity): Cap =
|
||||||
Cap(relay: turn.facet, target: e)
|
Cap(relay: turn.facet, target: e)
|
||||||
|
|
||||||
proc sync*(turn, refer: Cap, cb: proc(t: Turn) {.gcsafe.}) =
|
type SyncContinuation {.final.} = ref object of Entity
|
||||||
raiseAssert "not implemented"
|
action: TurnAction
|
||||||
|
|
||||||
|
method message(entity: SyncContinuation; turn: var Turn; v: AssertionRef) =
|
||||||
|
entity.action(turn)
|
||||||
|
|
||||||
|
proc sync*(turn: var Turn; refer: Cap; act: TurnAction) =
|
||||||
|
let e = SyncContinuation(action: act)
|
||||||
|
sync(turn, refer, newCap(turn, SyncContinuation(action: act)))
|
||||||
|
|
||||||
proc running*(actor): bool =
|
proc running*(actor): bool =
|
||||||
result = not actor.exited
|
result = not actor.exited
|
||||||
|
|
|
@ -20,7 +20,7 @@ type
|
||||||
|
|
||||||
Extension* = Value
|
Extension* = Value
|
||||||
Sync* {.preservesRecord: "sync".} = object
|
Sync* {.preservesRecord: "sync".} = object
|
||||||
`peer`* {.preservesLiteral: "#!#t".}: tuple[]
|
`peer`* {.preservesEmbedded.}: Value
|
||||||
|
|
||||||
TurnEvent* {.preservesTuple.} = object
|
TurnEvent* {.preservesTuple.} = object
|
||||||
`oid`*: Oid
|
`oid`*: Oid
|
||||||
|
|
|
@ -25,6 +25,7 @@ type
|
||||||
Assertion = Value
|
Assertion = Value
|
||||||
WireRef = sturdy.WireRef
|
WireRef = sturdy.WireRef
|
||||||
Turn = syndicate.Turn
|
Turn = syndicate.Turn
|
||||||
|
Handle = actors.Handle
|
||||||
|
|
||||||
type
|
type
|
||||||
PacketWriter = proc (pkt: sink Packet): Future[void] {.gcsafe.}
|
PacketWriter = proc (pkt: sink Packet): Future[void] {.gcsafe.}
|
||||||
|
@ -146,10 +147,11 @@ method sync(re: RelayEntity; turn: var Turn; peer: Cap) {.gcsafe.} =
|
||||||
var
|
var
|
||||||
peerEntity = newSyncPeerEntity(re.relay, peer)
|
peerEntity = newSyncPeerEntity(re.relay, peer)
|
||||||
exported: seq[WireSymbol]
|
exported: seq[WireSymbol]
|
||||||
discard rewriteCapOut(re.relay, turn.newCap(peerEntity), exported)
|
wr = rewriteCapOut(re.relay, turn.newCap(peerEntity), exported)
|
||||||
# TODO: discard?
|
|
||||||
peerEntity.e = exported[0]
|
peerEntity.e = exported[0]
|
||||||
re.send(turn, Event(orKind: EventKind.Sync))
|
var ev = Event(orKind: EventKind.Sync)
|
||||||
|
ev.sync.peer = wr.toPreserves.embed
|
||||||
|
re.send(turn, ev)
|
||||||
|
|
||||||
proc newRelayEntity(label: string; r: Relay; o: Oid): RelayEntity =
|
proc newRelayEntity(label: string; r: Relay; o: Oid): RelayEntity =
|
||||||
RelayEntity(label: label, relay: r, oid: o)
|
RelayEntity(label: label, relay: r, oid: o)
|
||||||
|
@ -170,10 +172,12 @@ proc rewriteCapIn(relay; facet; n: WireRef, imported: var seq[WireSymbol]): Cap
|
||||||
case n.orKind
|
case n.orKind
|
||||||
of WireRefKind.mine:
|
of WireRefKind.mine:
|
||||||
var e = relay.imported.grab(n.mine.oid)
|
var e = relay.imported.grab(n.mine.oid)
|
||||||
if e.isNil: e = newWireSymbol(
|
if e.isNil:
|
||||||
relay.imported,
|
e = newWireSymbol(
|
||||||
n.mine.oid,
|
relay.imported,
|
||||||
newCap(facet, newRelayEntity("rewriteCapIn", relay, n.mine.oid)))
|
n.mine.oid,
|
||||||
|
newCap(facet, newRelayEntity("rewriteCapIn", relay, n.mine.oid)),
|
||||||
|
)
|
||||||
imported.add e
|
imported.add e
|
||||||
result = e.cap
|
result = e.cap
|
||||||
of WireRefKind.yours:
|
of WireRefKind.yours:
|
||||||
|
|
Loading…
Reference in New Issue