11 #include <so_5_extra/async_op/details.hpp> 12 #include <so_5_extra/async_op/errors.hpp> 14 #include <so_5/details/invoke_noexcept_code.hpp> 16 #include <so_5/impl/internal_env_iface.hpp> 18 #include <so_5/agent.hpp> 19 #include <so_5/send_functions.hpp> 21 #include <so_5/timers.hpp> 23 #include <so_5/outliving.hpp> 99 const so_5::state_t & state,
100 std::type_index subscription_type,
101 so_5::event_handler_method_t handler )
120 const so_5::state_t & state,
121 so_5::event_handler_method_t handler )
177 ::so_5::details::do_with_rollback_on_exception( [&] {
178 for(; i != m_completion_handlers.size(); ++i )
180 auto & ch = m_completion_handlers[ i ];
181 m_owner.get().so_create_event_subscription(
183 ch.m_subscription_type,
186 ::so_5::thread_safety_t::unsafe,
187 ::so_5::event_handler_kind_t::final_handler );
191 drop_completion_handlers_subscriptions_up_to( i );
199 std::size_t upper_border )
noexcept 201 for( std::size_t i = 0; i != upper_border; ++i )
203 const auto & ch = m_completion_handlers[ i ];
204 m_owner.get().so_destroy_event_subscription(
206 ch.m_subscription_type,
223 ::so_5::details::do_with_rollback_on_exception( [&] {
224 do_subscribe_default_timeout_handler();
227 do_unsubscribe_default_timeout_handler();
239 ::so_5::details::do_with_rollback_on_exception( [&] {
240 for(; i != m_timeout_handlers.size(); ++i )
242 auto & th = m_timeout_handlers[ i ];
243 m_owner.get().so_create_event_subscription(
248 ::so_5::thread_safety_t::unsafe,
249 ::so_5::event_handler_kind_t::final_handler );
253 drop_timeout_handlers_subscriptions_up_to( i );
261 m_owner.get().so_create_deadletter_subscription(
264 m_default_timeout_handler,
265 ::so_5::thread_safety_t::unsafe );
275 std::size_t upper_border )
noexcept 277 for( std::size_t i = 0; i != upper_border; ++i )
279 const auto & th = m_timeout_handlers[ i ];
280 m_owner.get().so_destroy_event_subscription(
291 drop_completion_handlers_subscriptions_up_to(
292 m_completion_handlers.size() );
308 m_owner.get().so_destroy_deadletter_subscription(
310 m_timeout_msg_type );
320 drop_timeout_handlers_subscriptions_up_to(
321 m_timeout_handlers.size() );
340 m_timeout_timer_id.release();
344 m_completion_handlers.clear();
345 m_timeout_handlers.clear();
346 m_default_timeout_handler = ::so_5::event_handler_method_t{};
354 if( !m_default_timeout_handler )
356 m_default_timeout_handler =
357 [op = ::so_5::intrusive_ptr_t<op_data_t>(
this)](
358 ::so_5::message_ref_t & )
379 ::so_5::outliving_reference_t< ::so_5::agent_t > owner,
381 const std::type_index & timeout_msg_type )
395 return m_timeout_mbox;
402 return m_timeout_msg_type;
409 return m_owner.get();
416 return m_owner.get().so_environment();
423 std::size_t capacity )
425 m_completion_handlers.reserve( capacity );
432 std::size_t capacity )
434 m_timeout_handlers.reserve( capacity );
452 ::so_5::details::do_with_rollback_on_exception(
454 create_timeout_handlers_subscriptions();
457 drop_all_completion_handlers_subscriptions();
481 const ::so_5::mbox_t & mbox,
483 const ::so_5::state_t & state,
485 const std::type_index msg_type,
487 ::so_5::event_handler_method_t evt_handler )
489 m_completion_handlers.emplace_back(
493 std::move(evt_handler) );
500 const ::so_5::state_t & state,
502 ::so_5::event_handler_method_t evt_handler )
504 m_timeout_handlers.emplace_back(
506 std::move(evt_handler) );
518 ::so_5::event_handler_method_t evt_handler )
520 m_default_timeout_handler = std::move(evt_handler);
527 ::so_5::timer_id_t id )
529 m_timeout_timer_id = std::move(id);
622 details::op_shptr_t< Operation_Data > op )
748 template<
typename Operation_Data >
763 details::op_shptr_t< Operation_Data > op )
786 return static_cast<
bool>(
m_op);
796 "An attempt to do something on non-activable async_op" );
803 std::size_t capacity )
814 std::size_t capacity )
833 typename Event_Handler >
839 Msg_Target && msg_target,
841 const ::so_5::state_t & state,
843 Event_Handler && evt_handler )
878 template<
typename Event_Handler >
882 const ::so_5::state_t & state,
884 Event_Handler && evt_handler )
900 template<
typename Event_Handler >
904 Event_Handler && evt_handler )
915 template<
typename Event_Handler >
930 "An attempt to register timeout handler for " 931 "different message type. Expected type: " )
1062 ::so_5::outliving_reference_t< ::so_5::agent_t > owner )
1086 using base_type_t::is_activable;
1107 std::size_t capacity ) &
1114 template<
typename... Args >
1118 return std::move(
this->reserve_completion_handlers_capacity(
1119 std::forward<Args>(args)... ));
1140 std::size_t capacity ) &
1147 template<
typename... Args >
1151 return std::move(
this->reserve_timeout_handlers_capacity(
1152 std::forward<Args>(args)... ));
1193 typename Msg_Target,
1194 typename Event_Handler >
1200 Msg_Target && msg_target,
1202 const ::so_5::state_t & state,
1204 Event_Handler && evt_handler ) &
1215 template<
typename... Args >
1261 template<
typename Event_Handler >
1264 const ::so_5::state_t & state,
1265 Event_Handler && evt_handler ) &
1275 template<
typename... Args >
1329 template<
typename Event_Handler >
1333 Event_Handler && evt_handler ) &
1342 template<
typename... Args >
1424 template<
typename... Args >
1429 std::chrono::steady_clock::duration timeout,
1461 template<
typename... Args >
1465 return this->activate( std::forward<Args>(args)... );
1513 template<
typename Message >
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.