use std::error::Error;
use std::marker;
use std::panic::set_hook;
use std::thread::{Builder, JoinHandle};
use crate::binary::struct_trait::session::Session;
use crate::meshedchannels::MeshedChannels;
use crate::name::Name;
use crate::role::Role;
#[doc(hidden)]
fn fork_simple<S1, S2, R, N, P>(p: P, s: MeshedChannels<S1, S2, R, N>, name: &str) -> JoinHandle<()>
where
S1: Session + 'static,
S2: Session + 'static,
R: Role + 'static,
N: Name + 'static,
P: FnOnce(MeshedChannels<S1, S2, R, N>) -> Result<(), Box<dyn Error>> + marker::Send + 'static,
{
Builder::new()
.name(String::from(name))
.stack_size(64 * 1024 * 1024)
.spawn(move || {
set_hook(Box::new(|_info| {
}));
match p(s) {
Ok(()) => (),
Err(e) => panic!("{:?}", e),
}
})
.unwrap()
}
pub fn fork_mpst<S0, S1, S2, R0, R1, R2, N0, N1, N2, F0, F1, F2>(
f0: F0,
f1: F1,
f2: F2,
) -> (JoinHandle<()>, JoinHandle<()>, JoinHandle<()>)
where
S0: Session + 'static,
S1: Session + 'static,
S2: Session + 'static,
R0: Role + 'static,
R1: Role + 'static,
R2: Role + 'static,
N0: Name + 'static,
N1: Name + 'static,
N2: Name + 'static,
F0: FnOnce(MeshedChannels<S0, S1, R0, N0>) -> Result<(), Box<dyn Error>>
+ marker::Send
+ 'static,
F1: FnOnce(MeshedChannels<<S0 as Session>::Dual, S2, R1, N1>) -> Result<(), Box<dyn Error>>
+ marker::Send
+ 'static,
F2: FnOnce(
MeshedChannels<<S1 as Session>::Dual, <S2 as Session>::Dual, R2, N2>,
) -> Result<(), Box<dyn Error>>
+ marker::Send
+ 'static,
{
let (channel_ab, channel_ba) = S0::new();
let (channel_ac, channel_ca) = S1::new();
let (channel_bc, channel_cb) = S2::new();
let (role_a, _) = R0::new();
let (role_b, _) = R1::new();
let (role_c, _) = R2::new();
let (name_a, _) = N0::new();
let (name_b, _) = N1::new();
let (name_c, _) = N2::new();
let a = MeshedChannels {
session1: channel_ab,
session2: channel_ac,
stack: role_a,
name: name_a,
};
let b = MeshedChannels {
session1: channel_ba,
session2: channel_bc,
stack: role_b,
name: name_b,
};
let c = MeshedChannels {
session1: channel_ca,
session2: channel_cb,
stack: role_c,
name: name_c,
};
(
fork_simple(f0, a, "f0"),
fork_simple(f1, b, "f1"),
fork_simple(f2, c, "f3"),
)
}