11 #include <so_5_extra/async_op/details.hpp> 12 #include <so_5_extra/async_op/errors.hpp> 14 #include <so_5/details/h/invoke_noexcept_code.hpp> 16 #include <so_5/rt/impl/h/internal_env_iface.hpp> 18 #include <so_5/rt/h/agent.hpp> 19 #include <so_5/rt/h/send_functions.hpp> 21 #include <so_5/h/timers.hpp> 23 #include <so_5/h/outliving.hpp> 25 #if defined(SO_5_VERSION) 26 #if (SO_5_VERSION < SO_5_VERSION_MAKE(5
, 21
, 0
)) 27 #error "SObjectizer v.5.5.21 or above is required" 30 #error "SObjectizer v.5.5.21 or above is required" 107 const so_5::state_t & state,
108 std::type_index subscription_type,
109 so_5::event_handler_method_t handler )
128 const so_5::state_t & state,
129 so_5::event_handler_method_t handler )
185 ::so_5::details::do_with_rollback_on_exception( [&] {
186 for(; i != m_completion_handlers.size(); ++i )
188 auto & ch = m_completion_handlers[ i ];
189 m_owner.get().so_create_event_subscription(
191 ch.m_subscription_type,
194 ::so_5::thread_safety_t::unsafe );
198 drop_completion_handlers_subscriptions_up_to( i );
206 std::size_t upper_border )
noexcept 208 for( std::size_t i = 0; i != upper_border; ++i )
210 const auto & ch = m_completion_handlers[ i ];
211 m_owner.get().so_destroy_event_subscription(
213 ch.m_subscription_type,
230 ::so_5::details::do_with_rollback_on_exception( [&] {
231 do_subscribe_default_timeout_handler();
234 do_unsubscribe_default_timeout_handler();
246 ::so_5::details::do_with_rollback_on_exception( [&] {
247 for(; i != m_timeout_handlers.size(); ++i )
249 auto & th = m_timeout_handlers[ i ];
250 m_owner.get().so_create_event_subscription(
255 ::so_5::thread_safety_t::unsafe );
259 drop_timeout_handlers_subscriptions_up_to( i );
267 m_owner.get().so_create_deadletter_subscription(
270 m_default_timeout_handler,
271 ::so_5::thread_safety_t::unsafe );
281 std::size_t upper_border )
noexcept 283 for( std::size_t i = 0; i != upper_border; ++i )
285 const auto & th = m_timeout_handlers[ i ];
286 m_owner.get().so_destroy_event_subscription(
297 drop_completion_handlers_subscriptions_up_to(
298 m_completion_handlers.size() );
314 m_owner.get().so_destroy_deadletter_subscription(
316 m_timeout_msg_type );
326 drop_timeout_handlers_subscriptions_up_to(
327 m_timeout_handlers.size() );
346 m_timeout_timer_id.release();
350 m_completion_handlers.clear();
351 m_timeout_handlers.clear();
352 m_default_timeout_handler = ::so_5::event_handler_method_t{};
360 if( !m_default_timeout_handler )
362 m_default_timeout_handler =
363 [op = ::so_5::intrusive_ptr_t<op_data_t>(
this)](
364 ::so_5::invocation_type_t ,
365 ::so_5::message_ref_t & )
386 ::so_5::outliving_reference_t< ::so_5::agent_t > owner,
388 const std::type_index & timeout_msg_type )
632 details::op_shptr_t< Operation_Data > op )
656 SO_5_NODISCARD status_t
758 template<
typename Operation_Data >
773 details::op_shptr_t< Operation_Data > op )
806 "An attempt to do something on non-activable async_op" );
941 "An attempt to register timeout handler for " 942 "different message type. Expected type: " )
1074 ::so_5::outliving_reference_t< ::so_5::agent_t > owner )
1098 using base_type_t::is_activable;
1119 std::size_t capacity ) &
1126 template<
typename... Args >
1130 return std::move(
this->reserve_completion_handlers_capacity(
1131 std::forward<Args>(args)... ));
1152 std::size_t capacity ) &
1159 template<
typename... Args >
1163 return std::move(
this->reserve_timeout_handlers_capacity(
1164 std::forward<Args>(args)... ));
1205 typename Msg_Target,
1206 typename Event_Handler >
1212 Msg_Target && msg_target,
1214 const ::so_5::state_t & state,
1216 Event_Handler && evt_handler ) &
1227 template<
typename... Args >
1273 template<
typename Event_Handler >
1276 const ::so_5::state_t & state,
1277 Event_Handler && evt_handler ) &
1287 template<
typename... Args >
1341 template<
typename Event_Handler >
1345 Event_Handler && evt_handler ) &
1354 template<
typename... Args >
1436 template<
typename... Args >
1441 std::chrono::steady_clock::duration timeout,
1474 template<
typename... Args >
1478 return this->activate( std::forward<Args>(args)... );
1532 return definition_point_t<Message>( ::so_5::outliving_mutable(owner) );
Description of one completion handler subscription.
completion_handler_subscription_t(so_5::mbox_t mbox, const so_5::state_t &state, std::type_index subscription_type, so_5::event_handler_method_t handler)
Initializing constructor.
timeout_handler_subscription_t(const so_5::state_t &state, so_5::event_handler_method_t handler)
Initializing constructor.
Description of one timeout handler subscription.
::so_5::outliving_reference_t< const ::so_5::state_t > m_state
State for that a subscription should be created.
Ranges for error codes of each submodules.
::so_5::event_handler_method_t m_handler
Event handler.
::so_5::mbox_t m_mbox
Mbox from that a message is expected.
::so_5::outliving_reference_t< const ::so_5::state_t > m_state
State for that a subscription should be created.
::so_5::event_handler_method_t m_handler
Event handler.
std::type_index m_subscription_type
Subscription type.