Changeset - cc23d3cb40d3
[Not reviewed]
0 5 0
Christopher Esterhuyse - 5 years ago 2020-02-05 17:54:35
christopheresterhuyse@gmail.com
natives working
5 files changed with 49 insertions and 22 deletions:
0 comments (0 inline, 0 general)
src/runtime/connector.rs
Show inline comments
 
@@ -21,7 +21,7 @@ impl Default for Connector {
 
}
 
impl Connector {
 
    /// Configure the Connector with the given Pdl description.
 
    pub fn configure(&mut self, pdl: &[u8]) -> Result<(), ConfigErr> {
 
    pub fn configure(&mut self, pdl: &[u8], main_component: &[u8]) -> Result<(), ConfigErr> {
 
        use ConfigErr::*;
 
        let controller_id = match self {
 
            Connector::Configured(_) => return Err(AlreadyConfigured),
 
@@ -29,8 +29,13 @@ impl Connector {
 
            Connector::Unconfigured(Unconfigured { controller_id }) => *controller_id,
 
        };
 
        let protocol_description = Arc::new(ProtocolD::parse(pdl).map_err(ParseErr)?);
 
        let configured =
 
            Configured { controller_id, protocol_description, bindings: Default::default() };
 
        let polarities = protocol_description.component_polarities(main_component)?;
 
        let configured = Configured {
 
            controller_id,
 
            protocol_description,
 
            bindings: Default::default(),
 
            polarities,
 
        };
 
        *self = Connector::Configured(configured);
 
        Ok(())
 
    }
 
@@ -46,6 +51,9 @@ impl Connector {
 
            Connector::Unconfigured { .. } => Err(NotConfigured),
 
            Connector::Connected(_) => Err(AlreadyConnected),
 
            Connector::Configured(configured) => {
 
                if configured.polarities.len() <= proto_port_index {
 
                    return Err(IndexOutOfBounds);
 
                }
 
                configured.bindings.insert(proto_port_index, binding);
 
                Ok(())
 
            }
 
@@ -60,14 +68,7 @@ impl Connector {
 
            Connector::Configured(configured) => configured,
 
        };
 
        // 1. Unwrap bindings or err
 
        let mut bindings_vec = Vec::with_capacity(configured.bindings.len());
 
        for native_index in 0..configured.bindings.len() {
 
            let binding =
 
                configured.bindings.get(&native_index).ok_or(PortNotBound { native_index })?;
 
            bindings_vec.push(*binding);
 
        }
 
        let bound_proto_interface: Vec<(_, _)> = (0..num_bindings)
 
            .map(|i| configured.bindings.get())
 
        let bound_proto_interface: Vec<(_, _)> = configured
 
            .proto_maybe_bindings
 
            .iter()
 
            .copied()
src/runtime/errors.rs
Show inline comments
 
@@ -28,6 +28,8 @@ pub enum ConfigErr {
 
    AlreadyConnected,
 
    ParseErr(String),
 
    AlreadyConfigured,
 
    NoSuchComponent,
 
    NonPortTypeParameters,
 
}
 
#[derive(Debug, Clone)]
 
pub enum ConnectErr {
 
@@ -79,3 +81,13 @@ pub enum MessengerRecvErr {
 
    PollingFailed,
 
    EndpointErr(EndpointErr),
 
}
 
impl From<MainComponentErr> for ConfigErr {
 
    fn from(e: MainComponentErr) -> Self {
 
        use ConfigErr as C;
 
        use MainComponentErr as M;
 
        match e {
 
            M::NoSuchComponent => C::NoSuchComponent,
 
            M::NonPortTypeParameters => C::NonPortTypeParameters,
 
        }
 
    }
 
}
src/runtime/ffi.rs
Show inline comments
 
@@ -110,14 +110,20 @@ pub extern "C" fn connector_with_controller_id(controller_id: ControllerId) -> *
 
/// # Safety
 
/// TODO
 
#[no_mangle]
 
pub unsafe extern "C" fn connector_configure(connector: *mut Connector, pdl: *mut c_char) -> c_int {
 
pub unsafe extern "C" fn connector_configure(
 
    connector: *mut Connector,
 
    pdl: *mut c_char,
 
    main: *mut c_char,
 
) -> c_int {
 
    let mut b = Box::from_raw(connector); // unsafe!
 
    let ret = as_rust_bytes(pdl, |pdl_bytes| match b.configure(pdl_bytes) {
 
        Ok(()) => 0,
 
        Err(e) => {
 
            overwrite_last_error(format!("{:?}", e).as_bytes());
 
            -1
 
        }
 
    let ret = as_rust_bytes(pdl, |pdl_bytes| {
 
        as_rust_bytes(main, |main_bytes| match b.configure(pdl_bytes, main_bytes) {
 
            Ok(()) => 0,
 
            Err(e) => {
 
                overwrite_last_error(format!("{:?}", e).as_bytes());
 
                -1
 
            }
 
        })
 
    });
 
    Box::into_raw(b); // don't drop!
 
    ret
src/runtime/mod.rs
Show inline comments
 
@@ -51,6 +51,7 @@ pub struct Unconfigured {
 
#[derive(Debug)]
 
pub struct Configured {
 
    controller_id: ControllerId,
 
    polarities: Vec<Polarity>,
 
    bindings: HashMap<usize, PortBinding>,
 
    protocol_description: Arc<ProtocolD>,
 
}
src/test/connector.rs
Show inline comments
 
@@ -23,6 +23,7 @@ fn next_addr() -> SocketAddr {
 
fn incremental() {
 
    let timeout = Duration::from_millis(1_500);
 
    let addrs = [next_addr(), next_addr()];
 
    static PDL: &[u8] = b"";
 
    let handles = vec![
 
        thread::spawn(move || {
 
            let controller_id = 0;
 
@@ -34,6 +35,7 @@ fn incremental() {
 
                        put(a, m);
 
                    }
 
                }",
 
                b"main",
 
            )
 
            .unwrap();
 
            x.bind_port(0, Passive(addrs[0])).unwrap();
 
@@ -51,6 +53,7 @@ fn incremental() {
 
                        get(a);
 
                    }
 
                }",
 
                b"main",
 
            )
 
            .unwrap();
 
            x.bind_port(0, Active(addrs[0])).unwrap();
 
@@ -85,6 +88,7 @@ fn duo_positive() {
 
                    put(b, m);
 
                }
 
            }",
 
            b"main",
 
        )
 
        .unwrap();
 
        x.bind_port(0, Passive(addrs[0])).unwrap();
 
@@ -114,6 +118,7 @@ fn duo_positive() {
 
                    }
 
                }
 
            }",
 
            b"main",
 
        )
 
        .unwrap();
 
        x.bind_port(0, Active(addrs[0])).unwrap();
 
@@ -144,6 +149,7 @@ fn duo_negative() {
 
                    put(a, m); // fires a on second round
 
                }
 
            }",
 
            b"main",
 
        )
 
        .unwrap();
 
        x.bind_port(0, Passive(addrs[0])).unwrap();
 
@@ -175,6 +181,7 @@ fn duo_negative() {
 
                    }
 
                }
 
            }",
 
            b"main",
 
        )
 
        .unwrap();
 
        x.bind_port(0, Active(addrs[0])).unwrap();
 
@@ -202,14 +209,14 @@ fn connect_natives() {
 
    let addrs = [next_addr()];
 
    do_all(&[
 
        &|x| {
 
            x.configure(CHAIN).unwrap();
 
            x.configure(CHAIN, b"main").unwrap();
 
            x.bind_port(0, Native).unwrap();
 
            x.bind_port(1, Passive(addrs[0])).unwrap();
 
            x.connect(timeout).unwrap();
 
            assert_eq!(0, x.sync(timeout).unwrap());
 
        },
 
        &|x| {
 
            x.configure(CHAIN).unwrap();
 
            x.configure(CHAIN, b"main").unwrap();
 
            x.bind_port(0, Active(addrs[0])).unwrap();
 
            x.bind_port(1, Native).unwrap();
 
            x.connect(timeout).unwrap();
 
@@ -231,7 +238,7 @@ fn forward() {
 
    do_all(&[
 
        //
 
        &|x| {
 
            x.configure(FORWARD).unwrap();
 
            x.configure(FORWARD, b"main").unwrap();
 
            x.bind_port(0, Native).unwrap();
 
            x.bind_port(1, Passive(addrs[0])).unwrap();
 
            x.connect(timeout).unwrap();
 
@@ -241,7 +248,7 @@ fn forward() {
 
            assert_eq!(0, x.sync(timeout).unwrap());
 
        },
 
        &|x| {
 
            x.configure(FORWARD).unwrap();
 
            x.configure(FORWARD, b"main").unwrap();
 
            x.bind_port(0, Active(addrs[0])).unwrap();
 
            x.bind_port(1, Native).unwrap();
 
            x.connect(timeout).unwrap();
0 comments (0 inline, 0 general)