#[derive(Debug)]
pub struct PerThreadQueueSubscriber<T: Terminate, MessageHandlerArguments: Debug + Copy, E: Debug>
{
queue: Arc<Queue<MessageHandlerArguments, E>>,
terminate: Arc<T>,
}
impl<T: Terminate, MessageHandlerArguments: Debug + Copy, E: Debug> PerThreadQueueSubscriber<T, MessageHandlerArguments, E>
{
#[inline(always)]
pub fn new<MHR: MessageHandlersRegistration<MessageHandlerArguments=MessageHandlerArguments, E=E>>(queue_per_threads_publisher: QueuePerThreadQueuesPublisher<MessageHandlerArguments, E>, terminate: Arc<T>, message_handlers_registration: &MHR, message_handlers_registration_arguments: &MHR::Arguments) -> Self
{
let logical_core_identifier = LogicalCores::current_logical_core();
let queue = queue_per_threads_publisher.get_queue(logical_core_identifier);
message_handlers_registration.register_all_message_handlers(queue.message_handlers(), message_handlers_registration_arguments);
Self
{
queue,
terminate,
}
}
#[inline(always)]
pub fn receive_and_handle_messages(&self, message_handler_arguments: MessageHandlerArguments) -> Result<(), E>
{
self.queue.dequeue(self.terminate.deref(), message_handler_arguments)
}
}