8 #include <so_5_extra/error_ranges.hpp> 10 #include <so_5/impl/msg_tracing_helpers.hpp> 12 #include <so_5/details/sync_helpers.hpp> 14 #include <so_5/mbox.hpp> 15 #include <so_5/send_functions.hpp> 17 #include <so_5/outliving.hpp> 76 so_5::send< shutdown_initiated_t >( m_notify_mbox );
83 struct shutdown_time_elapsed_t
final :
public so_5::message_t {};
99 outliving_reference_t< environment_t > env,
117 SO_5_THROW_EXCEPTION( rc_not_implemented,
118 "subscribe_event_handler is not implemented for " 119 "time_elapsed_mbox" );
133 std::ostringstream ss;
134 ss <<
"<mbox:type=MPSC:shutdowner_time_elapsed:id=" << m_id <<
">";
141 return mbox_type_t::multi_producer_single_consumer;
146 message_delivery_mode_t ,
149 unsigned int )
override 151 m_env.get().error_logger().log(
153 "Time of shutdown operation is elapsed. " 154 "Application will be terminated." );
164 SO_5_THROW_EXCEPTION( rc_not_implemented,
165 "set_delivery_filter is not implemented for " 166 "time_elapsed_mbox" );
204 abstract_message_sink_t & sink )
216 return abstract_message_sink_t::special_sink_ptr_compare(
217 std::addressof(
this->m_sink.get() ),
218 std::addressof( o.m_sink.get() ) );
280 outliving_reference_t< holder_t > status )
285 current()
const noexcept {
return m_status.get().current(); }
290 m_status.get().m_status = new_status;
338 mbox_t time_elapsed_mbox,
339 std::chrono::steady_clock::duration max_shutdown_time )
357 template<
typename Lock_Type,
typename Tracing_Base >
361 ,
private Tracing_Base
364 template<
typename... Tracing_Base_Args >
367 outliving_reference_t< environment_t > env,
369 mbox_t time_elapsed_mbox,
371 std::chrono::steady_clock::duration max_shutdown_time,
375 Tracing_Base_Args && ...tracing_args )
396 const std::type_index & type_index,
397 abstract_message_sink_t & subscriber )
override 407 const std::type_index & type_index,
408 abstract_message_sink_t & subscriber )
noexcept override 423 ss <<
"<mbox:type=MPMC:shutdowner:id=" <<
m_id <<
">";
435 message_delivery_mode_t delivery_mode,
436 const std::type_index & msg_type,
437 const message_ref_t & message,
438 unsigned int )
override 449 const std::type_index & msg_type,
455 "unable to set delivery filter to shutdowner mbox" );
496 "only shutdown_initiated_t message type is allowed to " 497 "be used with shutdowner mbox" );
506 abstract_message_sink_t & subscriber )
511 "a creation of new subscription is disabled during " 512 "shutdown procedure" );
529 abstract_message_sink_t & subscriber )
573 message_delivery_mode_t delivery_mode,
574 const std::type_index & msg_type,
575 const message_ref_t & message )
601 message_delivery_mode_t delivery_mode,
602 const std::type_index & msg_type,
603 const message_ref_t & message )
698 template<
typename Lock_Type >
705 std::chrono::steady_clock::duration shutdown_time )
829 template<
typename Lock_Type =
std::
mutex >
871 layer( ::so_5::environment_t & env )
873 return *(env.query_layer< ::so_5::extra::shutdowner::layer_t >());
Ranges for error codes of each submodules.