Refactor BrokerTask
This commit is contained in:
parent
22283dc7ca
commit
ba3104ec6f
@ -1,6 +1,7 @@
|
||||
use log::trace;
|
||||
use std::{
|
||||
any::{Any, TypeId},
|
||||
borrow::Cow,
|
||||
collections::HashMap,
|
||||
marker::PhantomData,
|
||||
};
|
||||
@ -13,7 +14,9 @@ pub type ErasedSender = Box<dyn Any + Send + Sync>;
|
||||
pub trait MessageType {
|
||||
fn message_type_id(&self) -> TypeId;
|
||||
|
||||
fn create_sender(&self) -> ErasedSender;
|
||||
fn message_type_name(&self) -> &'static str;
|
||||
|
||||
fn create_broadcast_sender(&self) -> ErasedSender;
|
||||
}
|
||||
|
||||
pub struct BasicMessageType<T> {
|
||||
@ -33,7 +36,11 @@ impl<T: Message> MessageType for BasicMessageType<T> {
|
||||
TypeId::of::<T>()
|
||||
}
|
||||
|
||||
fn create_sender(&self) -> ErasedSender {
|
||||
fn message_type_name(&self) -> &'static str {
|
||||
std::any::type_name::<T>()
|
||||
}
|
||||
|
||||
fn create_broadcast_sender(&self) -> ErasedSender {
|
||||
trace!(
|
||||
"Creating sender for {} ({:?})",
|
||||
std::any::type_name::<T>(),
|
||||
@ -131,14 +138,22 @@ impl<T: Message> BasicAdvertiseRequest<T> {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct TopicEntry {
|
||||
message_type_id: TypeId,
|
||||
message_type_name: String,
|
||||
sender: ErasedSender,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Registry {
|
||||
senders: HashMap<TypeId, ErasedSender>,
|
||||
topics: HashMap<Cow<'static, str>, TopicEntry>,
|
||||
}
|
||||
|
||||
impl Default for Registry {
|
||||
fn default() -> Self {
|
||||
Registry {
|
||||
senders: HashMap::new(),
|
||||
topics: HashMap::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -146,8 +161,14 @@ impl Default for Registry {
|
||||
impl Registry {
|
||||
fn get_sender_for_type(&mut self, message_type: &dyn MessageType) -> &ErasedSender {
|
||||
let type_id = message_type.message_type_id();
|
||||
let sender_entry = self.senders.entry(type_id);
|
||||
sender_entry.or_insert_with(|| message_type.create_sender())
|
||||
let type_name = message_type.message_type_name();
|
||||
let topic_entry = self.topics.entry(type_name.into());
|
||||
let topic_entry = topic_entry.or_insert_with(|| TopicEntry {
|
||||
message_type_id: type_id,
|
||||
message_type_name: type_name.to_string(),
|
||||
sender: message_type.create_broadcast_sender(),
|
||||
});
|
||||
&topic_entry.sender
|
||||
}
|
||||
|
||||
fn handle_subscribe(&mut self, subscribe_request: SubscribeRequestBox) {
|
||||
@ -180,15 +201,13 @@ impl BrokerTask {
|
||||
Some(advertise_req) = self.advertise_rx.recv() => {
|
||||
registry.handle_advertise(advertise_req)
|
||||
}
|
||||
else => {
|
||||
trace!("no more handles to BrokerTask");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// trace!("BrokerTask exiting");
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for BrokerTask {
|
||||
fn drop(&mut self) {
|
||||
trace!("BrokerTask dropped");
|
||||
trace!("BrokerTask exiting");
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user