641 std::lock_guard< Lock_Type > lock{
this->m_lock };
643 auto [it_consumer, _] =
this->m_consumers_with_mboxes.emplace(
644 id, one_consumer_mboxes_map_t{} );
645 auto & consumer_map = it_consumer->second;
647 auto it_msg = consumer_map.find( msg_type );
648 if( it_msg == consumer_map.end() )
650 it_msg = consumer_map.emplace(
652 this->m_env.create_mbox() ).first;
655 return it_msg->second;
668 ::so_5::message_delivery_mode_t delivery_mode,
669 const std::type_index & msg_type,
670 const ::so_5::message_ref_t & message,
671 unsigned int redirection_deep )
override
673 namespace err_ns = ::so_5::extra::msg_hierarchy::errors;
676 if( ::so_5::message_mutability_t::immutable_message !=
677 message_mutability( message ) )
678 SO_5_THROW_EXCEPTION(
679 ::so_5::rc_mutable_msg_cannot_be_delivered_via_mpmc_mbox,
680 "an attempt to deliver mutable message via MPMC mbox"
681 ", msg_type=" + std::string(msg_type.name()) );
683 const ::so_5::message_t * raw_msg = message.get();
685 SO_5_THROW_EXCEPTION(
686 err_ns::rc_signal_cannot_be_delivered,
687 "signal can't be handled by msg_hierarchy's demuxer" );
689 const root_base_t * root =
dynamic_cast<
const root_base_t *>(raw_msg);
691 SO_5_THROW_EXCEPTION(
692 err_ns::rc_message_is_not_derived_from_root,
693 "a message type has to be derived from root_t" );
696 std::shared_lock< Lock_Type > lock{
this->m_lock };
699 this->do_delivery_procedure_for_immutable_message(