#[derive(Debug, Clone)]
pub struct QueuePerThreadQueuesPublisher<MessageHandlerArguments: Debug + Copy, E: Debug>
{
queues: Arc<PerLogicalCoreData<Arc<Queue<MessageHandlerArguments, E>>>>,
}
unsafe impl<MessageHandlerArguments: Debug + Copy, E: Debug> Send for QueuePerThreadQueuesPublisher<MessageHandlerArguments, E>
{
}
unsafe impl<MessageHandlerArguments: Debug + Copy, E: Debug> Sync for QueuePerThreadQueuesPublisher<MessageHandlerArguments, E>
{
}
impl<MessageHandlerArguments: Debug + Copy, E: Debug> QueuePerThreadQueuesPublisher<MessageHandlerArguments, E>
{
#[inline(always)]
pub fn allocate(logical_cores: &LogicalCores, queue_size_in_bytes: usize) -> Self
{
Self
{
queues: Queue::queues(logical_cores, queue_size_in_bytes)
}
}
#[inline(always)]
pub fn publish_message<MessageContents, F: FnOnce(NonNull<MessageContents>)>(&self, logical_core_identifier: LogicalCoreIdentifier, compressed_type_identifier: CompressedTypeIdentifier, message_contents_constructor: F)
{
let queue = self.queues.get_or_current(logical_core_identifier);
queue.enqueue(compressed_type_identifier, message_contents_constructor)
}
#[inline(always)]
fn get_queue(&self, logical_core_identifier: LogicalCoreIdentifier) -> Arc<Queue<MessageHandlerArguments, E>>
{
self.queues.get(logical_core_identifier).unwrap().clone()
}
}