549class actual_mbox_t
final
550 :
public ::so_5::abstract_message_box_t
551 ,
protected traits_t<Config_Type>::size_specific_base_type
552 ,
protected ::so_5::details::lock_holder_detector< lock_t<Config_Type> >::type
553 ,
protected Tracing_Base
557 using size_specific_base_type =
typename
558 traits_t<Config_Type>::size_specific_base_type;
562 using tracing_base_type = Tracing_Base;
566 using messages_collected_t = ::so_5::extra::mboxes::collecting_mbox::details::
567 messages_collected_t<Config_Type>;
570 using messages_collected_builder_t =
typename
575 using collecting_message_subscription_type =
typename
576 message_payload_type<
577 collecting_msg_t<Config_Type>>::subscription_type;
581 using messages_collected_subscription_type =
typename
583 is_mutable_message< collecting_msg_t<Config_Type> >::value,
584 mutable_msg< messages_collected_t >,
585 messages_collected_t >
590 typename Specific_Base_Type_Tuple,
591 std::size_t... Specific_Base_Type_Indexes,
592 typename Tracing_Base_Type_Tuple,
593 std::size_t... Tracing_Base_Type_Indexes >
596 Specific_Base_Type_Tuple && specific_base_type_args,
598 Tracing_Base_Type_Tuple && tracing_base_type_args,
600 : size_specific_base_type{
602 std::get<Specific_Base_Type_Indexes>(
603 std::forward<Specific_Base_Type_Tuple>(
604 specific_base_type_args))... }
606 std::get<Tracing_Base_Type_Indexes>(
607 std::forward<Tracing_Base_Type_Tuple>(
608 tracing_base_type_args))... }
610 check_mutability_validity_for_target_mbox<Config_Type>(
617
618
619
620
621
622
623
624
625
626
628 typename... Size_Specific_Base_Args,
629 typename... Tracing_Base_Args >
634 std::tuple<Size_Specific_Base_Args...> && size_specific_base_args,
637 std::tuple<Tracing_Base_Args...> && tracing_base_args )
640 std::move(size_specific_base_args),
641 std::make_index_sequence<
sizeof...(Size_Specific_Base_Args)>{},
642 std::move(tracing_base_args),
643 std::make_index_sequence<
sizeof...(Tracing_Base_Args)>{} }
657 SO_5_THROW_EXCEPTION(
658 errors::rc_subscribe_event_handler_be_used_on_collecting_mbox,
659 "subscribe_event_handler is called for collecting-mbox" );
672 std::ostringstream s;
673 s <<
"<mbox:type=COLLECTINGMBOX:id=" <<
this->m_id <<
">";
681 return this->m_target->type();
686 message_delivery_mode_t delivery_mode,
687 const std::type_index & msg_type,
688 const message_ref_t & message,
689 unsigned int overlimit_reaction_deep )
override
691 ensure_valid_message_type( msg_type );
693 typename Tracing_Base::deliver_op_tracer tracer{
698 msg_type, message, overlimit_reaction_deep };
700 collect_new_message( tracer, delivery_mode, message );
709 SO_5_THROW_EXCEPTION(
710 errors::rc_delivery_filter_cannot_be_used_on_collecting_mbox,
711 "set_delivery_filter is called for collecting-mbox" );
725 return this->m_target->environment();
736 static const std::type_index expected_type_id =
737 typeid(collecting_message_subscription_type);
739 if( expected_type_id != msg_type_id )
740 SO_5_THROW_EXCEPTION(
741 errors::rc_different_message_type,
742 std::string(
"an attempt to send message or signal of "
743 "different type. expected type: " )
744 + expected_type_id.name() +
", actual type: "
745 + msg_type_id.name() );
750 typename Tracing_Base::deliver_op_tracer
const & tracer,
751 message_delivery_mode_t delivery_mode,
752 const message_ref_t & message )
754 this->lock_and_perform( [&] {
756 m_msg_builder.store( message,
this->messages_to_collect() );
757 tracer.make_trace(
"collected" );
760 if( m_msg_builder.is_ready_to_be_sent(
761 this->messages_to_collect() ) )
763 using namespace ::so_5::impl::msg_tracing_helpers::details;
765 auto msg_to_send = m_msg_builder.extract_message();
767 tracer.make_trace(
"deliver_collected_bunch",
768 text_separator{
"->" },
769 mbox_as_msg_destination{ *(
this->m_target) } );
771 this->m_target->do_deliver_message(
773 typeid(messages_collected_subscription_type),
774 std::move(msg_to_send),