Use u64 internally for assertion handles

This commit is contained in:
Tony Garnock-Jones 2021-07-22 10:07:49 +02:00
parent 4a69d5573f
commit 6c3f039026
5 changed files with 56 additions and 56 deletions

View File

@ -29,7 +29,7 @@ use tokio_util::sync::CancellationToken;
use tracing::Instrument; use tracing::Instrument;
pub use super::schemas::internal_protocol::_Any; pub use super::schemas::internal_protocol::_Any;
pub use super::schemas::internal_protocol::Handle; pub type Handle = u64;
pub type ActorResult = Result<(), Error>; pub type ActorResult = Result<(), Error>;
pub type ActorHandle = tokio::task::JoinHandle<ActorResult>; pub type ActorHandle = tokio::task::JoinHandle<ActorResult>;
@ -225,15 +225,13 @@ impl<'activation> Activation<'activation> {
if let Some(assertion) = r.rewrite(a.into()) { if let Some(assertion) = r.rewrite(a.into()) {
{ {
let r = Arc::clone(r); let r = Arc::clone(r);
let handle = handle.clone();
self.queue_for(&r).push(Box::new( self.queue_for(&r).push(Box::new(
move |t| r.with_entity(|e| e.assert(t, assertion, handle)))); move |t| r.with_entity(|e| e.assert(t, assertion, handle))));
} }
{ {
let r = Arc::clone(r); let r = Arc::clone(r);
let handle = handle.clone();
self.actor.outbound_assertions.insert( self.actor.outbound_assertions.insert(
handle.clone(), handle,
Destination::Remote(Arc::clone(&r), Box::new( Destination::Remote(Arc::clone(&r), Box::new(
move |t| r.with_entity(|e| e.retract(t, handle))))); move |t| r.with_entity(|e| e.retract(t, handle)))));
} }
@ -247,15 +245,13 @@ impl<'activation> Activation<'activation> {
if let Some(assertion) = r.rewrite(a.into()) { if let Some(assertion) = r.rewrite(a.into()) {
{ {
let r = Arc::clone(r); let r = Arc::clone(r);
let handle = handle.clone();
self.immediate_self.push(Box::new( self.immediate_self.push(Box::new(
move |t| r.with_entity(|e| e.assert(t, assertion, handle)))); move |t| r.with_entity(|e| e.assert(t, assertion, handle))));
} }
{ {
let r = Arc::clone(r); let r = Arc::clone(r);
let handle = handle.clone();
self.actor.outbound_assertions.insert( self.actor.outbound_assertions.insert(
handle.clone(), handle,
Destination::ImmediateSelf(Box::new( Destination::ImmediateSelf(Box::new(
move |t| r.with_entity(|e| e.retract(t, handle))))); move |t| r.with_entity(|e| e.retract(t, handle)))));
} }

View File

@ -217,7 +217,7 @@ fn handle_resolve(ds: &mut Arc<Ref>, t: &mut Activation, a: _Any) -> DuringResul
target = debug(&target), target = debug(&target),
"sturdyref resolved"); "sturdyref resolved");
let h = t.assert(observer, _Any::domain(target)); let h = t.assert(observer, _Any::domain(target));
Ok(Some(Box::new(|_observer, t| Ok(t.retract(h))))) Ok(Some(Box::new(move |_observer, t| Ok(t.retract(h)))))
} }
} }
}) })
@ -245,7 +245,7 @@ fn handle_resolve(ds: &mut Arc<Ref>, t: &mut Activation, a: _Any) -> DuringResul
})), })),
observer: handler, observer: handler,
}); });
Ok(Some(Box::new(|_ds, t| Ok(t.retract(oh))))) Ok(Some(Box::new(move |_ds, t| Ok(t.retract(oh)))))
} }
} }
} }

View File

@ -35,8 +35,7 @@ pub fn next_actor_id() -> ActorId {
static NEXT_HANDLE: AtomicU64 = AtomicU64::new(3); static NEXT_HANDLE: AtomicU64 = AtomicU64::new(3);
pub fn next_handle() -> Handle { pub fn next_handle() -> Handle {
Handle(value::signed_integer::SignedInteger::from( NEXT_HANDLE.fetch_add(BUMP_AMOUNT.into(), Ordering::Relaxed)
NEXT_HANDLE.fetch_add(BUMP_AMOUNT.into(), Ordering::Relaxed) as u128))
} }
static NEXT_MAILBOX_ID: AtomicU64 = AtomicU64::new(4); static NEXT_MAILBOX_ID: AtomicU64 = AtomicU64::new(4);

View File

@ -6,7 +6,7 @@ use crate::during;
use crate::error::Error; use crate::error::Error;
use crate::error::error; use crate::error::error;
use crate::schemas::gatekeeper; use crate::schemas::gatekeeper;
use crate::schemas::internal_protocol::*; use crate::schemas::internal_protocol as P;
use crate::schemas::sturdy; use crate::schemas::sturdy;
use crate::schemas::tunnel_relay; use crate::schemas::tunnel_relay;
@ -81,10 +81,10 @@ pub struct TunnelRelay
{ {
self_ref: Arc<Ref>, self_ref: Arc<Ref>,
input_buffer: BytesMut, input_buffer: BytesMut,
inbound_assertions: Map</* remote */ Handle, (/* local */ Handle, Vec<Arc<WireSymbol>>)>, inbound_assertions: Map</* remote */ P::Handle, (/* local */ Handle, Vec<Arc<WireSymbol>>)>,
outbound_assertions: Map<Handle, Vec<Arc<WireSymbol>>>, outbound_assertions: Map<P::Handle, Vec<Arc<WireSymbol>>>,
membranes: Membranes, membranes: Membranes,
pending_outbound: Vec<TurnEvent>, pending_outbound: Vec<P::TurnEvent>,
output: UnboundedSender<LoanedItem<Vec<u8>>>, output: UnboundedSender<LoanedItem<Vec<u8>>>,
} }
@ -202,27 +202,27 @@ impl TunnelRelay {
result result
} }
fn handle_inbound_packet(&mut self, t: &mut Activation, p: Packet) -> ActorResult { fn handle_inbound_packet(&mut self, t: &mut Activation, p: P::Packet) -> ActorResult {
// tracing::trace!(packet = debug(&p), "-->"); // tracing::trace!(packet = debug(&p), "-->");
match p { match p {
Packet::Error(b) => { P::Packet::Error(b) => {
tracing::info!(message = debug(b.message.clone()), tracing::info!(message = debug(b.message.clone()),
detail = debug(b.detail.clone()), detail = debug(b.detail.clone()),
"received Error from peer"); "received Error from peer");
Err(*b) Err(*b)
}, },
Packet::Turn(b) => { P::Packet::Turn(b) => {
let t = &mut Activation::new(t.actor, Arc::clone(&t.debtor)); let t = &mut Activation::new(t.actor, Arc::clone(&t.debtor));
let Turn(events) = *b; let P::Turn(events) = *b;
for TurnEvent { oid, event } in events { for P::TurnEvent { oid, event } in events {
let target = match self.membranes.exported.oid_map.get(&sturdy::Oid(oid.0.clone())) { let target = match self.membranes.exported.oid_map.get(&sturdy::Oid(oid.0.clone())) {
Some(ws) => &ws.obj, Some(ws) => &ws.obj,
None => return Err(error("Cannot deliver event: nonexistent oid", None => return Err(error("Cannot deliver event: nonexistent oid",
_Any::from(&TurnEvent { oid, event }))), _Any::from(&P::TurnEvent { oid, event }))),
}; };
match event { match event {
Event::Assert(b) => { P::Event::Assert(b) => {
let Assert { assertion: Assertion(a), handle: remote_handle } = *b; let P::Assert { assertion: P::Assertion(a), handle: remote_handle } = *b;
let mut imported = vec![]; let mut imported = vec![];
let imported_membrane = &mut self.membranes.imported; let imported_membrane = &mut self.membranes.imported;
a.foreach_embedded::<_, Error>(&mut |r| { a.foreach_embedded::<_, Error>(&mut |r| {
@ -233,8 +233,8 @@ impl TunnelRelay {
return Err(error("Assertion with duplicate handle", _Any::new(false))); return Err(error("Assertion with duplicate handle", _Any::new(false)));
} }
} }
Event::Retract(b) => { P::Event::Retract(b) => {
let Retract { handle: remote_handle } = *b; let P::Retract { handle: remote_handle } = *b;
let (local_handle, imported) = match self.inbound_assertions.remove(&remote_handle) { let (local_handle, imported) = match self.inbound_assertions.remove(&remote_handle) {
None => return Err(error("Retraction of nonexistent handle", _Any::from(&remote_handle))), None => return Err(error("Retraction of nonexistent handle", _Any::from(&remote_handle))),
Some(wss) => wss, Some(wss) => wss,
@ -244,8 +244,8 @@ impl TunnelRelay {
} }
t.retract(local_handle); t.retract(local_handle);
} }
Event::Message(b) => { P::Event::Message(b) => {
let Message { body: Assertion(a) } = *b; let P::Message { body: P::Assertion(a) } = *b;
let imported_membrane = &mut self.membranes.imported; let imported_membrane = &mut self.membranes.imported;
a.foreach_embedded(&mut |r| { a.foreach_embedded(&mut |r| {
let ws = imported_membrane.acquire(r); let ws = imported_membrane.acquire(r);
@ -256,8 +256,8 @@ impl TunnelRelay {
})?; })?;
t.message(target, a); t.message(target, a);
} }
Event::Sync(b) => { P::Event::Sync(b) => {
let Sync { peer } = *b; let P::Sync { peer } = *b;
self.membranes.imported.acquire(&peer); self.membranes.imported.acquire(&peer);
struct SyncPeer { struct SyncPeer {
tr: Arc<Ref>, tr: Arc<Ref>,
@ -290,25 +290,25 @@ impl TunnelRelay {
} }
} }
fn handle_outbound_event(&mut self, t: &mut Activation, mut event: Event) -> Result<Event, Error> { fn handle_outbound_event(&mut self, t: &mut Activation, event: P::Event) -> Result<P::Event, Error> {
match &mut event { match &event {
Event::Assert(b) => { P::Event::Assert(b) => {
let Assert { assertion: Assertion(a), handle } = &**b; let P::Assert { assertion: P::Assertion(a), handle } = &**b;
let mut outbound = Vec::new(); let mut outbound = Vec::new();
a.foreach_embedded::<_, Error>( a.foreach_embedded::<_, Error>(
&mut |r| Ok(outbound.push(self.membranes.export_ref(Arc::clone(r), true))))?; &mut |r| Ok(outbound.push(self.membranes.export_ref(Arc::clone(r), true))))?;
self.outbound_assertions.insert(handle.clone(), outbound); self.outbound_assertions.insert(handle.clone(), outbound);
} }
Event::Retract(b) => { P::Event::Retract(b) => {
let Retract { handle } = &**b; let P::Retract { handle } = &**b;
if let Some(outbound) = self.outbound_assertions.remove(handle) { if let Some(outbound) = self.outbound_assertions.remove(handle) {
for ws in outbound.into_iter() { for ws in outbound.into_iter() {
self.membranes.exported.release(&ws); self.membranes.exported.release(&ws);
} }
} }
} }
Event::Message(b) => { P::Event::Message(b) => {
let Message { body: Assertion(a) } = &**b; let P::Message { body: P::Assertion(a) } = &**b;
a.foreach_embedded(&mut |r| { a.foreach_embedded(&mut |r| {
let ws = self.membranes.export_ref(Arc::clone(r), false); let ws = self.membranes.export_ref(Arc::clone(r), false);
match ws.ref_count.load(Ordering::SeqCst) { match ws.ref_count.load(Ordering::SeqCst) {
@ -317,18 +317,18 @@ impl TunnelRelay {
} }
})?; })?;
}, },
Event::Sync(_b) => panic!("TODO not yet implemented"), P::Event::Sync(_b) => panic!("TODO not yet implemented"),
} }
Ok(event) Ok(event)
} }
fn encode_packet(&mut self, p: Packet) -> Result<Vec<u8>, Error> { fn encode_packet(&mut self, p: P::Packet) -> Result<Vec<u8>, Error> {
let item = _Any::from(&p); let item = _Any::from(&p);
// tracing::trace!(packet = debug(&item), "<--"); // tracing::trace!(packet = debug(&item), "<--");
Ok(PackedWriter::encode::<_, _Any, _>(&mut self.membranes, &item)?) Ok(PackedWriter::encode::<_, _Any, _>(&mut self.membranes, &item)?)
} }
pub fn send_packet(&mut self, debtor: &Arc<Debtor>, cost: usize, p: Packet) -> ActorResult { pub fn send_packet(&mut self, debtor: &Arc<Debtor>, cost: usize, p: P::Packet) -> ActorResult {
let bs = self.encode_packet(p)?; let bs = self.encode_packet(p)?;
let _ = self.output.send(LoanedItem::new(debtor, cost, bs)); let _ = self.output.send(LoanedItem::new(debtor, cost, bs));
Ok(()) Ok(())
@ -367,7 +367,7 @@ impl Membranes {
relay_ref: &Arc<Ref>, relay_ref: &Arc<Ref>,
src: &'src mut S, src: &'src mut S,
_read_annotations: bool, _read_annotations: bool,
) -> io::Result<_Ptr> { ) -> io::Result<P::_Ptr> {
let v: IOValue = PackedReader::new(src, NoEmbeddedDomainCodec).demand_next(false)?; let v: IOValue = PackedReader::new(src, NoEmbeddedDomainCodec).demand_next(false)?;
match sturdy::WireRef::try_from(&v)? { match sturdy::WireRef::try_from(&v)? {
sturdy::WireRef::Mine{ oid: b } => { sturdy::WireRef::Mine{ oid: b } => {
@ -403,21 +403,21 @@ struct ActivatedMembranes<'a, 'activation, 'm>(&'a mut Activation<'activation>,
&'m Arc<Ref>, &'m Arc<Ref>,
&'m mut Membranes); &'m mut Membranes);
impl<'a, 'activation, 'm> DomainDecode<_Ptr> for ActivatedMembranes<'a, 'activation, 'm> { impl<'a, 'activation, 'm> DomainDecode<P::_Ptr> for ActivatedMembranes<'a, 'activation, 'm> {
fn decode_embedded<'de, 'src, S: BinarySource<'de>>( fn decode_embedded<'de, 'src, S: BinarySource<'de>>(
&mut self, &mut self,
src: &'src mut S, src: &'src mut S,
read_annotations: bool, read_annotations: bool,
) -> io::Result<_Ptr> { ) -> io::Result<P::_Ptr> {
self.2.decode_embedded(self.0, self.1, src, read_annotations) self.2.decode_embedded(self.0, self.1, src, read_annotations)
} }
} }
impl DomainEncode<_Ptr> for Membranes { impl DomainEncode<P::_Ptr> for Membranes {
fn encode_embedded<W: Writer>( fn encode_embedded<W: Writer>(
&mut self, &mut self,
w: &mut W, w: &mut W,
d: &_Ptr, d: &P::_Ptr,
) -> io::Result<()> { ) -> io::Result<()> {
w.write(&mut NoEmbeddedDomainCodec, &_Any::from(&match self.exported.ref_map.get(d) { w.write(&mut NoEmbeddedDomainCodec, &_Any::from(&match self.exported.ref_map.get(d) {
Some(ws) => sturdy::WireRef::Mine { Some(ws) => sturdy::WireRef::Mine {
@ -547,7 +547,7 @@ impl Entity for TunnelRelay {
let mut src = BytesBinarySource::new(&bs); let mut src = BytesBinarySource::new(&bs);
let mut dec = ActivatedMembranes(t, &self.self_ref, &mut self.membranes); let mut dec = ActivatedMembranes(t, &self.self_ref, &mut self.membranes);
let mut r = src.packed::<_, _Any, _>(&mut dec); let mut r = src.packed::<_, _Any, _>(&mut dec);
let item = Packet::deserialize(&mut r)?; let item = P::Packet::deserialize(&mut r)?;
self.handle_inbound_packet(t, item)?; self.handle_inbound_packet(t, item)?;
} }
tunnel_relay::Input::Segment { bs } => { tunnel_relay::Input::Segment { bs } => {
@ -557,7 +557,7 @@ impl Entity for TunnelRelay {
let mut src = BytesBinarySource::new(&self.input_buffer); let mut src = BytesBinarySource::new(&self.input_buffer);
let mut dec = ActivatedMembranes(t, &self.self_ref, &mut self.membranes); let mut dec = ActivatedMembranes(t, &self.self_ref, &mut self.membranes);
let mut r = src.packed::<_, _Any, _>(&mut dec); let mut r = src.packed::<_, _Any, _>(&mut dec);
let e = match Packet::deserialize(&mut r) { let e = match P::Packet::deserialize(&mut r) {
Err(ParseError::Preserves(PreservesError::Io(e))) Err(ParseError::Preserves(PreservesError::Io(e)))
if is_eof_io_error(&e) => if is_eof_io_error(&e) =>
None, None,
@ -581,8 +581,8 @@ impl Entity for TunnelRelay {
t.message_immediate_self( t.message_immediate_self(
&self.self_ref, &tunnel_relay::RelayProtocol::Flush); &self.self_ref, &tunnel_relay::RelayProtocol::Flush);
} }
let turn_event = TurnEvent { let turn_event = P::TurnEvent {
oid: Oid(oid.0), oid: P::Oid(oid.0),
event: self.handle_outbound_event(t, event)?, event: self.handle_outbound_event(t, event)?,
}; };
self.pending_outbound.push(turn_event); self.pending_outbound.push(turn_event);
@ -598,7 +598,7 @@ impl Entity for TunnelRelay {
} }
tunnel_relay::RelayProtocol::Flush => { tunnel_relay::RelayProtocol::Flush => {
let events = std::mem::take(&mut self.pending_outbound); let events = std::mem::take(&mut self.pending_outbound);
self.send_packet(&t.debtor, events.len(), Packet::Turn(Box::new(Turn(events))))? self.send_packet(&t.debtor, events.len(), P::Packet::Turn(Box::new(P::Turn(events))))?
} }
} }
} }
@ -608,7 +608,7 @@ impl Entity for TunnelRelay {
fn exit_hook(&mut self, t: &mut Activation, exit_status: &ActorResult) -> ActorResult { fn exit_hook(&mut self, t: &mut Activation, exit_status: &ActorResult) -> ActorResult {
if let Err(e) = exit_status { if let Err(e) = exit_status {
let e = e.clone(); let e = e.clone();
self.send_packet(&t.debtor, 1, Packet::Error(Box::new(e)))?; self.send_packet(&t.debtor, 1, P::Packet::Error(Box::new(e)))?;
} }
Ok(()) Ok(())
} }
@ -621,25 +621,30 @@ impl Entity for RelayEntity {
fn assert(&mut self, t: &mut Activation, a: _Any, h: Handle) -> ActorResult { fn assert(&mut self, t: &mut Activation, a: _Any, h: Handle) -> ActorResult {
Ok(t.message(&self.relay_ref, &tunnel_relay::Output { Ok(t.message(&self.relay_ref, &tunnel_relay::Output {
oid: self.oid.clone(), oid: self.oid.clone(),
event: Event::Assert(Box::new(Assert { assertion: Assertion(a), handle: h })), event: P::Event::Assert(Box::new(P::Assert {
assertion: P::Assertion(a),
handle: P::Handle(h.into()),
})),
})) }))
} }
fn retract(&mut self, t: &mut Activation, h: Handle) -> ActorResult { fn retract(&mut self, t: &mut Activation, h: Handle) -> ActorResult {
Ok(t.message(&self.relay_ref, &tunnel_relay::Output { Ok(t.message(&self.relay_ref, &tunnel_relay::Output {
oid: self.oid.clone(), oid: self.oid.clone(),
event: Event::Retract(Box::new(Retract { handle: h })), event: P::Event::Retract(Box::new(P::Retract {
handle: P::Handle(h.into()),
})),
})) }))
} }
fn message(&mut self, t: &mut Activation, m: _Any) -> ActorResult { fn message(&mut self, t: &mut Activation, m: _Any) -> ActorResult {
Ok(t.message(&self.relay_ref, &tunnel_relay::Output { Ok(t.message(&self.relay_ref, &tunnel_relay::Output {
oid: self.oid.clone(), oid: self.oid.clone(),
event: Event::Message(Box::new(Message { body: Assertion(m) })), event: P::Event::Message(Box::new(P::Message { body: P::Assertion(m) })),
})) }))
} }
fn sync(&mut self, t: &mut Activation, peer: Arc<Ref>) -> ActorResult { fn sync(&mut self, t: &mut Activation, peer: Arc<Ref>) -> ActorResult {
Ok(t.message(&self.relay_ref, &tunnel_relay::Output { Ok(t.message(&self.relay_ref, &tunnel_relay::Output {
oid: self.oid.clone(), oid: self.oid.clone(),
event: Event::Sync(Box::new(Sync { peer })), event: P::Event::Sync(Box::new(P::Sync { peer })),
})) }))
} }
} }

View File

@ -8,8 +8,8 @@ use std::sync::Arc;
use crate::actor::_Any; use crate::actor::_Any;
use crate::actor::Activation; use crate::actor::Activation;
use crate::actor::Handle;
use crate::actor::Ref; use crate::actor::Ref;
use crate::schemas::internal_protocol::Handle;
use crate::schemas::dataspace_patterns as ds; use crate::schemas::dataspace_patterns as ds;
use crate::pattern::{self, PathStep, Path, Paths}; use crate::pattern::{self, PathStep, Path, Paths};