use std::sync::mpsc;
use super::*;
use slab::*;
pub trait DynamicDispatchTransmitter {
fn send (&self, from: &SlabRef, memoref: MemoRef);
}
enum TransmitterInternal {
Local(Mutex<mpsc::Sender<(SlabRef,MemoRef)>>),
Dynamic(Box<DynamicDispatchTransmitter + Send + Sync>),
Blackhole
}
#[derive(Debug)]
pub enum TransmitterArgs<'a>{
Local(&'a Slab),
Remote(&'a SlabId, &'a TransportAddress)
}
impl<'a> TransmitterArgs<'a>{
pub fn get_slab_id (&self) -> SlabId {
match self {
&TransmitterArgs::Local(ref s) => s.id.clone(),
&TransmitterArgs::Remote(ref id,_) => *id.clone()
}
}
}
impl TransmitterInternal {
pub fn kind (&self) -> &str {
match self {
&TransmitterInternal::Local(_) => "Local",
&TransmitterInternal::Dynamic(_) => "Dynamic",
&TransmitterInternal::Blackhole => "Blackhole"
}
}
}
pub struct Transmitter {
to_slab_id: SlabId,
internal: TransmitterInternal
}
impl Transmitter {
pub fn new_local( to_slab_id: SlabId, tx: Mutex<mpsc::Sender<(SlabRef,MemoRef)>> ) -> Self {
Self {
to_slab_id: to_slab_id,
internal: TransmitterInternal::Local( tx )
}
}
pub fn new_blackhole(to_slab_id: SlabId) -> Self {
Self {
to_slab_id: to_slab_id,
internal: TransmitterInternal::Blackhole
}
}
pub fn new(to_slab_id: SlabId, dyn: Box<DynamicDispatchTransmitter + Send + Sync>) -> Self {
Self {
to_slab_id: to_slab_id,
internal: TransmitterInternal::Dynamic(dyn)
}
}
pub fn send(&self, from: &SlabRef, memoref: MemoRef) {
let _ = self.internal.kind();
let _ = self.to_slab_id;
use self::TransmitterInternal::*;
match self.internal {
Local(ref tx) => {
tx.lock().unwrap().send((from.clone(),memoref)).expect("local transmitter send")
}
Dynamic(ref tx) => {
tx.send(from,memoref)
}
Blackhole => {
println!("WARNING! Transmitter Blackhole transmitter used. from {:?}, memoref {:?}", from, memoref );
}
}
}
}
impl Drop for TransmitterInternal{
fn drop(&mut self) {
}
}