From 0fb83f27a2387e11f67f37f9d1dde48268b669cb 2020-02-05 18:07:44 From: Christopher Esterhuyse Date: 2020-02-05 18:07:44 Subject: [PATCH] fixed natives sometimes choosing incomplete branches as solutions --- diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index 69d540318eac690a91df6e15f6ff48f3776251d5..5c353dc8115255e9773d0103f60bca8fa76adc94 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -15,7 +15,7 @@ use std::hint::unreachable_unchecked; pub struct ProtocolDescriptionImpl { heap: Heap, source: InputSource, - root: RootId + root: RootId, } impl std::fmt::Debug for ProtocolDescriptionImpl { @@ -86,15 +86,13 @@ impl ProtocolDescription for ProtocolDescriptionImpl { for (&x, y) in ports.iter().zip(self.component_polarities(identifier).unwrap()) { match y { Polarity::Getter => args.push(Value::Input(InputValue(x))), - Polarity::Putter => args.push(Value::Output(OutputValue(x))) + Polarity::Putter => args.push(Value::Output(OutputValue(x))), } } let h = &self.heap; let root = &h[self.root]; let def = root.get_definition_ident(h, identifier).unwrap(); - ComponentStateImpl { - prompt: Prompt::new(h, def, &args) - } + ComponentStateImpl { prompt: Prompt::new(h, def, &args) } } } diff --git a/src/runtime/actors.rs b/src/runtime/actors.rs index 2302702f7bdb5602ab30406b9d2845b8ed1e06d2..157a440160a6049f915af2342f58892b125d799d 100644 --- a/src/runtime/actors.rs +++ b/src/runtime/actors.rs @@ -384,7 +384,11 @@ impl PolyN { decision: &Predicate, table_row: &mut HashMap, ) -> MonoN { - if let Some((_, branch)) = self.branches.drain().find(|(p, _)| decision.satisfies(p)) { + if let Some((_, branch)) = self + .branches + .drain() + .find(|(p, branch)| branch.to_get.is_empty() && decision.satisfies(p)) + { let BranchN { gotten, sync_batch_index, .. } = branch; for (&key, payload) in gotten.iter() { assert!(table_row.insert(key, payload.clone()).is_none()); diff --git a/src/runtime/connector.rs b/src/runtime/connector.rs index 9ccde0df5d4ac99b2743ce0b7ed05d2bd35c598d..cf1c0fc59c38d0d073179b5a5c5cffbdb095b30d 100644 --- a/src/runtime/connector.rs +++ b/src/runtime/connector.rs @@ -35,6 +35,7 @@ impl Connector { protocol_description, bindings: Default::default(), polarities, + main_component: main_component.to_vec(), }; *self = Connector::Configured(configured); Ok(()) @@ -69,16 +70,22 @@ impl Connector { }; // 1. Unwrap bindings or err let bound_proto_interface: Vec<(_, _)> = configured - .proto_maybe_bindings + .polarities .iter() .copied() .enumerate() - .map(|(native_index, (polarity, maybe_binding))| { - Ok((maybe_binding.ok_or(PortNotBound { native_index })?, polarity)) + .map(|(native_index, polarity)| { + let binding = configured + .bindings + .get(&native_index) + .copied() + .ok_or(PortNotBound { native_index })?; + Ok((binding, polarity)) }) .collect::, ConnectErr>>()?; let (controller, native_interface) = Controller::connect( configured.controller_id, + &configured.main_component, configured.protocol_description.clone(), &bound_proto_interface[..], deadline, diff --git a/src/runtime/mod.rs b/src/runtime/mod.rs index 31931fcd10ed9e83743ac4710783bd80251d8d45..c2a47243997c608cba4fc4e3da050b4f935022b3 100644 --- a/src/runtime/mod.rs +++ b/src/runtime/mod.rs @@ -54,6 +54,7 @@ pub struct Configured { polarities: Vec, bindings: HashMap, protocol_description: Arc, + main_component: Vec, } #[derive(Debug)] pub struct Connected { diff --git a/src/runtime/setup.rs b/src/runtime/setup.rs index 0cfa3a63e6d214ddf27b0213d0d59035b52b96fc..358766d9ae2ec5369f0233d30621017af2aabcf6 100644 --- a/src/runtime/setup.rs +++ b/src/runtime/setup.rs @@ -20,6 +20,7 @@ impl Controller { // Given port bindings and a protocol config, create a connector with 1 native node pub fn connect( major: ControllerId, + main_component: &[u8], protocol_description: Arc, bound_proto_interface: &[(PortBinding, Polarity)], deadline: Instant, @@ -101,7 +102,7 @@ impl Controller { let n_mono = Some(MonoN { ekeys: ekeys_native.into_iter().collect(), result: None }); let p_monos = vec![MonoP { - state: protocol_description.new_main_component(&ekeys_proto), + state: protocol_description.new_main_component(main_component, &ekeys_proto), ekeys: ekeys_proto.into_iter().collect(), }]; diff --git a/src/test/setup.rs b/src/test/setup.rs index aa9de4f941b7274e536358043d9cb12e6da08483..aa4807afcd0520ebc12d3c9c0fa6806c0b64bf8d 100644 --- a/src/test/setup.rs +++ b/src/test/setup.rs @@ -9,7 +9,7 @@ use super::*; fn config_ok_0() { let pdl = b"primitive main() {}"; let d = ProtocolD::parse(pdl).unwrap(); - let pol = d.main_interface_polarities(); + let pol = d.component_polarities(b"main").unwrap(); assert_eq!(&pol[..], &[]); } @@ -17,8 +17,8 @@ fn config_ok_0() { fn config_ok_2() { let pdl = b"primitive main(in x, out y) {}"; let d = ProtocolD::parse(pdl).unwrap(); - let pol = d.main_interface_polarities(); - assert_eq!(&pol[..], &[Polarity::Getter, Polarity::Putter]); + let pol = d.component_polarities(b"main").unwrap(); + assert_eq!(&pol[..], &[Getter, Putter]); } #[test] @@ -37,14 +37,14 @@ fn config_and_connect_2() { // thread::spawn(move || { let mut x = Connector::Unconfigured(Unconfigured { controller_id: 0 }); - x.configure(b"primitive main(in a, out b) {}").unwrap(); + x.configure(b"primitive main(in a, out b) {}", b"main").unwrap(); x.bind_port(0, Passive(addrs[0])).unwrap(); x.bind_port(1, Passive(addrs[1])).unwrap(); x.connect(timeout).unwrap(); }), thread::spawn(move || { let mut x = Connector::Unconfigured(Unconfigured { controller_id: 1 }); - x.configure(b"primitive main(out a, in b) {}").unwrap(); + x.configure(b"primitive main(out a, in b) {}", b"main").unwrap(); x.bind_port(0, Active(addrs[0])).unwrap(); x.bind_port(1, Active(addrs[1])).unwrap(); x.connect(timeout).unwrap(); @@ -58,7 +58,7 @@ fn config_and_connect_2() { #[test] fn bind_too_much() { let mut x = Connector::Unconfigured(Unconfigured { controller_id: 0 }); - x.configure(b"primitive main(in a) {}").unwrap(); + x.configure(b"primitive main(in a) {}", b"main").unwrap(); x.bind_port(0, Native).unwrap(); assert!(x.bind_port(1, Native).is_err()); } @@ -77,14 +77,14 @@ fn config_and_connect_chain() { thread::spawn(move || { // PRODUCER A-> let mut x = Connector::Unconfigured(Unconfigured { controller_id: 0 }); - x.configure(b"primitive main(out a) {}").unwrap(); + x.configure(b"primitive main(out a) {}", b"main").unwrap(); x.bind_port(0, Active(addrs[0])).unwrap(); x.connect(timeout).unwrap(); }), thread::spawn(move || { // FORWARDER ->B-> let mut x = Connector::Unconfigured(Unconfigured { controller_id: 1 }); - x.configure(b"primitive main(in a, out b) {}").unwrap(); + x.configure(b"primitive main(in a, out b) {}", b"main").unwrap(); x.bind_port(0, Passive(addrs[0])).unwrap(); x.bind_port(1, Active(addrs[1])).unwrap(); x.connect(timeout).unwrap(); @@ -92,7 +92,7 @@ fn config_and_connect_chain() { thread::spawn(move || { // FORWARDER ->C-> let mut x = Connector::Unconfigured(Unconfigured { controller_id: 2 }); - x.configure(b"primitive main(in a, out b) {}").unwrap(); + x.configure(b"primitive main(in a, out b) {}", b"main").unwrap(); x.bind_port(0, Passive(addrs[1])).unwrap(); x.bind_port(1, Active(addrs[2])).unwrap(); x.connect(timeout).unwrap(); @@ -100,7 +100,7 @@ fn config_and_connect_chain() { thread::spawn(move || { // CONSUMER ->D let mut x = Connector::Unconfigured(Unconfigured { controller_id: 3 }); - x.configure(b"primitive main(in a) {}").unwrap(); + x.configure(b"primitive main(in a) {}", b"main").unwrap(); x.bind_port(0, Passive(addrs[2])).unwrap(); x.connect(timeout).unwrap(); }),