This repository has been archived on 2024-05-22. You can view files and clone it, but cannot push or open issues or pull requests.
syndicate-min/pkg/min_syndicate.nim

84 lines
1.9 KiB
Nim
Raw Normal View History

2024-04-24 14:15:13 +00:00
# SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import
min,
preserves,
syndicate,
./min_preserves
const
capType* = "syndicate-cap"
dictCapType = "dict:" & capType
proc discardTurn(turn: var Turn) = discard
proc newCapDict(i: In): MinValue =
result = i.scope.newDict
result.objType = capType
proc getCap(q: MinValue): Cap =
assert q.objType == capType
cast[Cap](q.obj)
proc setCap(q: MinValue; cap: Cap) =
q.obj = addr cap[]
proc runForObj(q: MinValue) =
while q.obj.isNil:
syndicate.runOnce()
proc syndicate_module*(i: In) =
let def = i.define()
def.symbol("dataspace") do (i: In):
let
2024-04-25 07:35:16 +00:00
vals = i.expect("dict")
2024-04-24 14:15:13 +00:00
dict = i.newCapDict
2024-04-25 07:35:16 +00:00
bootActor("dataspace") do (turn: var Turn):
2024-04-24 14:15:13 +00:00
dict.setCap turn.newDataspace
runForObj dict
i.push dict
def.symbol("assert") do (i: In):
let vals = i.expect(dictCapType, "a")
var
cap = vals[0].getCap
pr = i.toPreserves vals[1]
h = newVal 0
cap.relay.queueTurn do (turn: var Turn):
h.intVal = publish(turn, cap, pr)
while h.intVal == 0:
syndicate.runOnce()
i.push h
def.symbol("retract") do (i: In):
let
vals = i.expect(dictCapType, "int")
cap = vals[0].getCap
h = Handle vals[1].intVal
cap.relay.queueTurn do (turn: var Turn):
retract(turn, h)
def.symbol("message") do (i: In):
let vals = i.expect(dictCapType, "a")
var
cap = vals[0].getCap
pr = i.toPreserves vals[1]
cap.relay.queueTurn do (turn: var Turn):
message(turn, cap, pr)
def.symbol("sync") do (i: In):
let
vals = i.expect(dictCapType)
cap = vals[0].getCap
var pending = true
cap.relay.queueTurn do (turn: var Turn):
sync(turn, cap) do (turn: var Turn):
pending = false
while pending:
if not syndicate.runOnce():
raiseInvalid("failed to make sync progress")
def.finalize("syndicate")