SObjectizer  5.7
Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes | List of all members
so_5::mchain_props::mchain_template< Queue, Tracing_Base > Class Template Reference

Template-based implementation of message chain. More...

#include <mchain_details.hpp>

Inheritance diagram for so_5::mchain_props::mchain_template< Queue, Tracing_Base >:
so_5::abstract_message_chain_t so_5::abstract_message_box_t so_5::atomic_refcounted_t

Public Member Functions

template<typename... Tracing_Args>
 mchain_template (so_5::environment_t &env, mbox_id_t id, const mchain_params_t &params, Tracing_Args &&... tracing_args)
 Initializing constructor. More...
 
mbox_id_t id () const override
 Unique ID of this mbox. More...
 
void subscribe_event_handler (const std::type_index &, const so_5::message_limit::control_block_t *, agent_t &) override
 Add the message handler. More...
 
void unsubscribe_event_handlers (const std::type_index &, agent_t &) override
 Remove all message handlers. More...
 
std::string query_name () const override
 Get the mbox name. More...
 
mbox_type_t type () const override
 Get the type of message box. More...
 
void do_deliver_message (const std::type_index &msg_type, const message_ref_t &message, unsigned int) override
 Deliver message for all subscribers with respect to message limits. More...
 
void set_delivery_filter (const std::type_index &, const delivery_filter_t &, agent_t &) override
 
void drop_delivery_filter (const std::type_index &, agent_t &) noexcept override
 Removes delivery filter for message type and subscriber. More...
 
extraction_status_t extract (demand_t &dest, duration_t empty_queue_timeout) override
 
bool empty () const override
 Is message chain empty? More...
 
std::size_t size () const override
 Count of messages in the chain. More...
 
environment_tenvironment () const noexcept override
 SObjectizer Environment for which the mbox is created. More...
 
- Public Member Functions inherited from so_5::abstract_message_chain_t
so_5::mbox_t as_mbox ()
 Cast message chain to message box. More...
 
virtual void close (mchain_props::close_mode_t mode)
 Close the chain. More...
 
template<typename Exceptions_Control >
void close (Exceptions_Control, mchain_props::close_mode_t mode) noexcept(noexcept(details::should_terminate_if_throws_t< Exceptions_Control >::value))
 Close the chain. More...
 
virtual mbox_id_t id () const=0
 Unique ID of this mbox. More...
 
virtual so_5::environment_tenvironment () const noexcept=0
 SObjectizer Environment for which the mbox is created. More...
 

Protected Member Functions

extraction_status_t extract (demand_t &dest, select_case_t &select_case) override
 An extraction attempt as a part of multi chain select. More...
 
mchain_props::push_status_t push (const std::type_index &msg_type, const message_ref_t &message, mchain_props::select_case_t &select_case) override
 An attempt to push a new message into the mchain. More...
 
void remove_from_select (select_case_t &select_case) noexcept override
 Removement of mchain from multi chain select. More...
 
void do_deliver_message_from_timer (const std::type_index &msg_type, const message_ref_t &message) override
 Special method for message delivery from a timer thread. More...
 
void actual_close (close_mode_t mode) override
 Close the chain. More...
 
- Protected Member Functions inherited from so_5::abstract_message_chain_t
 abstract_message_chain_t ()=default
 
 ~abstract_message_chain_t () noexcept override=default
 
 abstract_message_box_t ()=default
 
virtual ~abstract_message_box_t () noexcept=default
 
bool operator== (const abstract_message_box_t &o) const noexcept
 
bool operator< (const abstract_message_box_t &o) const noexcept
 
- Protected Member Functions inherited from so_5::atomic_refcounted_t
 atomic_refcounted_t (const atomic_refcounted_t &)=delete
 
atomic_refcounted_toperator= (const atomic_refcounted_t &)=delete
 
 atomic_refcounted_t () noexcept
 Default constructor. More...
 
 ~atomic_refcounted_t () noexcept=default
 Destructor. More...
 
void inc_ref_count () noexcept
 Increments reference count. More...
 
unsigned long dec_ref_count () noexcept
 Decrement reference count. More...
 

Private Member Functions

void try_to_store_message_to_queue (const std::type_index &msg_type, const message_ref_t &message)
 Actual implementation of pushing message to the queue. More...
 
void try_to_store_message_from_timer_to_queue (const std::type_index &msg_type, const message_ref_t &message)
 An implementation of storing another message to chain for the case of delated/periodic messages. More...
 
extraction_status_t extract_demand_from_not_empty_queue (demand_t &dest)
 Implementation of extract operation for the case when message queue is not empty. More...
 
void notify_multi_chain_select_ops () noexcept
 
void complete_store_message_to_queue (typename Tracing_Base::deliver_op_tracer &tracer, const std::type_index &msg_type, const message_ref_t &message)
 A reusable method with implementation of last part of storing a message into chain. More...
 

Private Attributes

environment_tm_env
 SObjectizer Environment for which message chain is created. More...
 
details::status m_status = { details::status::open }
 Status of the chain. More...
 
const mbox_id_t m_id
 Mbox ID for chain. More...
 
const capacity_t m_capacity
 Chain capacity. More...
 
const not_empty_notification_func_t m_not_empty_notificator
 Optional notificator for 'not_empty' condition. More...
 
Queue m_queue
 Chain's demands queue. More...
 
std::mutex m_lock
 Chain's lock. More...
 
std::condition_variable m_underflow_cond
 Condition variable for waiting on empty queue. More...
 
std::condition_variable m_overflow_cond
 Condition variable for waiting on full queue. More...
 
std::size_t m_threads_to_wakeup = { 0 }
 Count of threads sleeping on empty mchain. More...
 
select_case_tm_select_tail = nullptr
 A queue of multi-chain selects in which this chain is used. More...
 

Additional Inherited Members

- Static Protected Member Functions inherited from so_5::abstract_message_box_t
static void delegate_deliver_message_from_timer (abstract_message_box_t &mbox, const std::type_index &msg_type, const message_ref_t &message)
 Helper for calling do_deliver_message_from_timer in derived classes. More...
 

Detailed Description

template<typename Queue, typename Tracing_Base>
class so_5::mchain_props::mchain_template< Queue, Tracing_Base >

Template-based implementation of message chain.

Since
v.5.5.13
Template Parameters
Queuetype of demand queue for message chain.
Tracing_Basetype with message tracing implementation details.

Constructor & Destructor Documentation

◆ mchain_template()

template<typename Queue , typename Tracing_Base >
template<typename... Tracing_Args>
so_5::mchain_props::mchain_template< Queue, Tracing_Base >::mchain_template ( so_5::environment_t env,
mbox_id_t  id,
const mchain_params_t params,
Tracing_Args &&...  tracing_args 
)
inline

Initializing constructor.

Parameters
envSObjectizer Environment for which message chain is created.
idMbox ID for this chain.
paramsChain parameters.
tracing_argsArguments for Tracing_Base's constructor.

Member Function Documentation

◆ actual_close()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::actual_close ( close_mode_t  mode)
inlineoverrideprotectedvirtual

Close the chain.

Attention
This method can throw exception.
Since
v.5.7.3

Implements so_5::abstract_message_chain_t.

◆ complete_store_message_to_queue()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::complete_store_message_to_queue ( typename Tracing_Base::deliver_op_tracer &  tracer,
const std::type_index &  msg_type,
const message_ref_t message 
)
inlineprivate

A reusable method with implementation of last part of storing a message into chain.

Note
Intended to be called from try_to_store_message_to_queue() and try_to_store_message_from_timer_to_queue().
Since
v.5.5.18

◆ do_deliver_message()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::do_deliver_message ( const std::type_index &  msg_type,
const message_ref_t message,
unsigned  overlimit_reaction_deep 
)
inlineoverridevirtual

Deliver message for all subscribers with respect to message limits.

Since
v.5.5.4
Note
Since v.5.6.0 this method is used for deliverance of ordinary messages/signals and for deliverance of enveloped messages.

Implements so_5::abstract_message_box_t.

◆ do_deliver_message_from_timer()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::do_deliver_message_from_timer ( const std::type_index &  msg_type,
const message_ref_t message 
)
inlineoverrideprotectedvirtual

Special method for message delivery from a timer thread.

Since
v.5.5.18

A message delivery from timer thread is somewhat different from an ordinary message delivery. Especially in the case when target mbox is a message chain. If that message chain is full and some kind of overflow reaction is specified (like waiting for some time or throwing an exception) then it can lead to undesired behaviour of the whole application. To take care about these cases a new method is introduced.

Note that implementation of that method in abstract_message_box_t class is just a proxy for do_deliver_message() method. It is done to keep compatibility with previous versions of SObjectizer. The actual implementation of that method is present only in message chains.

Reimplemented from so_5::abstract_message_box_t.

◆ drop_delivery_filter()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::drop_delivery_filter ( const std::type_index &  msg_type,
agent_t subscriber 
)
inlineoverridevirtualnoexcept

Removes delivery filter for message type and subscriber.

Since
v.5.5.5

Implements so_5::abstract_message_box_t.

◆ empty()

template<typename Queue , typename Tracing_Base >
bool so_5::mchain_props::mchain_template< Queue, Tracing_Base >::empty ( ) const
inlineoverridevirtual

Is message chain empty?

Implements so_5::abstract_message_chain_t.

◆ environment()

template<typename Queue , typename Tracing_Base >
environment_t& so_5::mchain_props::mchain_template< Queue, Tracing_Base >::environment ( ) const
inlineoverridevirtualnoexcept

SObjectizer Environment for which the mbox is created.

Since
v.5.6.0

Implements so_5::abstract_message_box_t.

◆ extract() [1/2]

template<typename Queue , typename Tracing_Base >
extraction_status_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::extract ( demand_t dest,
duration_t  empty_queue_timeout 
)
inlineoverridevirtual

◆ extract() [2/2]

template<typename Queue , typename Tracing_Base >
extraction_status_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::extract ( demand_t dest,
select_case_t select_case 
)
inlineoverrideprotectedvirtual

An extraction attempt as a part of multi chain select.

Attention
This method is a pure virtual since v.5.6.2.
Note
This method is intended to be used by select_case_t.
Since
v.5.5.16

Implements so_5::abstract_message_chain_t.

◆ extract_demand_from_not_empty_queue()

template<typename Queue , typename Tracing_Base >
extraction_status_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::extract_demand_from_not_empty_queue ( demand_t dest)
inlineprivate

Implementation of extract operation for the case when message queue is not empty.

Attention
This helper method must be called when chain object is locked in some hi-level method.
Since
v.5.5.16

◆ id()

template<typename Queue , typename Tracing_Base >
mbox_id_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::id ( ) const
inlineoverridevirtual

Unique ID of this mbox.

Since
v.5.4.0

Implements so_5::abstract_message_box_t.

◆ notify_multi_chain_select_ops()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::notify_multi_chain_select_ops ( )
inlineprivatenoexcept
Since
v.5.5.16

◆ push()

template<typename Queue , typename Tracing_Base >
mchain_props::push_status_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::push ( const std::type_index &  msg_type,
const message_ref_t message,
mchain_props::select_case_t select_case 
)
inlineoverrideprotectedvirtual

An attempt to push a new message into the mchain.

Unlike do_deliver_message() method the push() doesn't apply the overload reaction if the mchain if full. The select_case is stored to select_cases list instead.

Note
This method is intended to be used by select_case_t.
Since
v.5.7.0

Implements so_5::abstract_message_chain_t.

◆ query_name()

template<typename Queue , typename Tracing_Base >
std::string so_5::mchain_props::mchain_template< Queue, Tracing_Base >::query_name ( ) const
inlineoverridevirtual

Get the mbox name.

Implements so_5::abstract_message_box_t.

◆ remove_from_select()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::remove_from_select ( select_case_t select_case)
inlineoverrideprotectedvirtualnoexcept

Removement of mchain from multi chain select.

Attention
This method is a pure virtual and noexcept since v.5.6.2.
Note
This method is intended to be used by select_case_t.
Since
v.5.5.16

Implements so_5::abstract_message_chain_t.

◆ set_delivery_filter()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::set_delivery_filter ( const std::type_index &  ,
const delivery_filter_t ,
agent_t  
)
inlineoverridevirtual
Attention
Will throw an exception because delivery filter is not applicable to MPSC-mboxes.

Implements so_5::abstract_message_box_t.

◆ size()

template<typename Queue , typename Tracing_Base >
std::size_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::size ( ) const
inlineoverridevirtual

Count of messages in the chain.

Implements so_5::abstract_message_chain_t.

◆ subscribe_event_handler()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::subscribe_event_handler ( const std::type_index &  type_index,
const so_5::message_limit::control_block_t limit,
agent_t subscriber 
)
inlineoverridevirtual

Add the message handler.

Implements so_5::abstract_message_box_t.

◆ try_to_store_message_from_timer_to_queue()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::try_to_store_message_from_timer_to_queue ( const std::type_index &  msg_type,
const message_ref_t message 
)
inlineprivate

An implementation of storing another message to chain for the case of delated/periodic messages.

This implementation handles overloaded chains differently:

These defferences are necessary because the context of timer thread is very special: there can't be any long-time operation (like waiting for free space on overloaded chain) and there can't be an exception about mchain's overflow.

Since
v.5.5.18

◆ try_to_store_message_to_queue()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::try_to_store_message_to_queue ( const std::type_index &  msg_type,
const message_ref_t message 
)
inlineprivate

Actual implementation of pushing message to the queue.

Note
This implementation must be used for ordinary delivery operations. For delivery operations from timer thread another method must be called (see try_to_store_message_from_timer_to_queue()).

◆ type()

template<typename Queue , typename Tracing_Base >
mbox_type_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::type ( ) const
inlineoverridevirtual

Get the type of message box.

Since
v.5.5.3
Note
This method is primarily intended for internal usage. It is useful sometimes in subscription-related operations because there is no need to do some actions for MPSC mboxes.

Implements so_5::abstract_message_box_t.

◆ unsubscribe_event_handlers()

template<typename Queue , typename Tracing_Base >
void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::unsubscribe_event_handlers ( const std::type_index &  type_index,
agent_t subscriber 
)
inlineoverridevirtual

Remove all message handlers.

Implements so_5::abstract_message_box_t.

Member Data Documentation

◆ m_capacity

template<typename Queue , typename Tracing_Base >
const capacity_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_capacity
private

Chain capacity.

◆ m_env

template<typename Queue , typename Tracing_Base >
environment_t& so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_env
private

SObjectizer Environment for which message chain is created.

◆ m_id

template<typename Queue , typename Tracing_Base >
const mbox_id_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_id
private

Mbox ID for chain.

◆ m_lock

template<typename Queue , typename Tracing_Base >
std::mutex so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_lock
private

Chain's lock.

◆ m_not_empty_notificator

template<typename Queue , typename Tracing_Base >
const not_empty_notification_func_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_not_empty_notificator
private

Optional notificator for 'not_empty' condition.

◆ m_overflow_cond

template<typename Queue , typename Tracing_Base >
std::condition_variable so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_overflow_cond
private

Condition variable for waiting on full queue.

◆ m_queue

template<typename Queue , typename Tracing_Base >
Queue so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_queue
private

Chain's demands queue.

◆ m_select_tail

template<typename Queue , typename Tracing_Base >
select_case_t* so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_select_tail = nullptr
private

A queue of multi-chain selects in which this chain is used.

Since
v.5.5.16

◆ m_status

template<typename Queue , typename Tracing_Base >
details::status so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_status = { details::status::open }
private

Status of the chain.

◆ m_threads_to_wakeup

template<typename Queue , typename Tracing_Base >
std::size_t so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_threads_to_wakeup = { 0 }
private

Count of threads sleeping on empty mchain.

This value is incremented before sleeping on m_underflow_cond and decremented just after a return from this sleep.

Since
v.5.5.16

◆ m_underflow_cond

template<typename Queue , typename Tracing_Base >
std::condition_variable so_5::mchain_props::mchain_template< Queue, Tracing_Base >::m_underflow_cond
private

Condition variable for waiting on empty queue.


The documentation for this class was generated from the following file: