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 )
398 return m_timeout_mbox;
405 return m_timeout_msg_type;
412 return m_owner.get();
419 return m_owner.get().so_environment();
426 std::size_t capacity )
428 m_completion_handlers.reserve( capacity );
435 std::size_t capacity )
437 m_timeout_handlers.reserve( capacity );
455 ::so_5::details::do_with_rollback_on_exception(
457 create_timeout_handlers_subscriptions();
460 drop_all_completion_handlers_subscriptions();
484 const ::so_5::mbox_t & mbox,
486 const ::so_5::state_t & state,
488 const std::type_index msg_type,
490 ::so_5::event_handler_method_t evt_handler )
492 m_completion_handlers.emplace_back(
496 std::move(evt_handler) );
503 const ::so_5::state_t & state,
505 ::so_5::event_handler_method_t evt_handler )
507 m_timeout_handlers.emplace_back(
509 std::move(evt_handler) );
521 ::so_5::event_handler_method_t evt_handler )
523 m_default_timeout_handler = std::move(evt_handler);
530 ::so_5::timer_id_t id )
532 m_timeout_timer_id = std::move(id);
625 details::op_shptr_t< Operation_Data > op )
751 template<
typename Operation_Data >
766 details::op_shptr_t< Operation_Data > op )
799 "An attempt to do something on non-activable async_op" );
806 std::size_t capacity )
817 std::size_t capacity )
836 typename Event_Handler >
842 Msg_Target && msg_target,
844 const ::so_5::state_t & state,
846 Event_Handler && evt_handler )
881 template<
typename Event_Handler >
885 const ::so_5::state_t & state,
887 Event_Handler && evt_handler )
903 template<
typename Event_Handler >
907 Event_Handler && evt_handler )
918 template<
typename Event_Handler >
933 "An attempt to register timeout handler for " 934 "different message type. Expected type: " )
1065 ::so_5::outliving_reference_t< ::so_5::agent_t > owner )
1089 using base_type_t::is_activable;
1110 std::size_t capacity ) &
1117 template<
typename... Args >
1121 return std::move(
this->reserve_completion_handlers_capacity(
1122 std::forward<Args>(args)... ));
1143 std::size_t capacity ) &
1150 template<
typename... Args >
1154 return std::move(
this->reserve_timeout_handlers_capacity(
1155 std::forward<Args>(args)... ));
1196 typename Msg_Target,
1197 typename Event_Handler >
1203 Msg_Target && msg_target,
1205 const ::so_5::state_t & state,
1207 Event_Handler && evt_handler ) &
1218 template<
typename... Args >
1264 template<
typename Event_Handler >
1267 const ::so_5::state_t & state,
1268 Event_Handler && evt_handler ) &
1278 template<
typename... Args >
1332 template<
typename Event_Handler >
1336 Event_Handler && evt_handler ) &
1345 template<
typename... Args >
1427 template<
typename... Args >
1432 std::chrono::steady_clock::duration timeout,
1464 template<
typename... Args >
1468 return this->activate( std::forward<Args>(args)... );
1516 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.