SObjectizer  5.5
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...
 
virtual mbox_id_t id () const override
 Unique ID of this mbox. More...
 
virtual void subscribe_event_handler (const std::type_index &, const so_5::message_limit::control_block_t *, agent_t *) override
 Add the message handler. More...
 
virtual void unsubscribe_event_handlers (const std::type_index &, agent_t *) override
 Remove all message handlers. More...
 
virtual std::string query_name () const override
 Get the mbox name. More...
 
virtual mbox_type_t type () const override
 Get the type of message box. More...
 
virtual void do_deliver_message (const std::type_index &msg_type, const message_ref_t &message, unsigned int) const override
 Deliver message for all subscribers with respect to message limits. More...
 
virtual void do_deliver_service_request (const std::type_index &msg_type, const message_ref_t &message, unsigned int) const override
 Deliver service request. More...
 
void do_deliver_enveloped_msg (const std::type_index &msg_type, const message_ref_t &message, unsigned int) override
 Deliver enveloped message. More...
 
virtual void set_delivery_filter (const std::type_index &, const delivery_filter_t &, agent_t &) override
 
virtual void drop_delivery_filter (const std::type_index &, agent_t &) SO_5_NOEXCEPT override
 Removes delivery filter for message type and subscriber. More...
 
virtual extraction_status_t extract (demand_t &dest, duration_t empty_queue_timeout) override
 
virtual bool empty () const override
 Is message chain empty? More...
 
virtual std::size_t size () const override
 Count of messages in the chain. More...
 
virtual void close (close_mode_t mode) override
 Close the chain. More...
 
virtual environment_tenvironment () const override
 SObjectizer Environment for which the chain 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 mbox_id_t id () const=0
 Unique ID of this mbox. More...
 

Protected Member Functions

virtual extraction_status_t extract (demand_t &dest, select_case_t &select_case) override
 An extraction attempt as a part of multi chain select. More...
 
virtual void remove_from_select (select_case_t &select_case) override
 Removement of mchain from multi chain select. More...
 
virtual 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...
 
- Protected Member Functions inherited from so_5::abstract_message_chain_t
 abstract_message_chain_t ()=default
 
virtual ~abstract_message_chain_t () SO_5_NOEXCEPT=default
 
 abstract_message_box_t ()=default
 
virtual ~abstract_message_box_t () SO_5_NOEXCEPT=default
 
template<class Message >
void deliver_message (std::type_index subscription_type, const intrusive_ptr_t< Message > &msg_ref) const
 Deliver message. More...
 
template<class Message >
void deliver_message (const intrusive_ptr_t< Message > &msg_ref) const
 Deliver message. More...
 
template<class Message >
void deliver_message (std::type_index subscription_type, std::unique_ptr< Message > msg_unique_ptr, message_mutability_t mutability) const
 Deliver message. More...
 
template<class Message >
void deliver_message (std::unique_ptr< Message > msg_unique_ptr) const
 Deliver message. More...
 
template<class Message >
void deliver_message (Message *msg_raw_ptr) const
 Deliver message. More...
 
template<class Message >
void deliver_signal () const
 Deliver signal. More...
 
template<class Result >
service_invoke_proxy_t< Result > get_one ()
 Create a special proxy for service request invocation. More...
 
service_invoke_proxy_t< void > run_one ()
 Create a special proxy for service request invocation where return type is void. More...
 
void deliver_message (const std::type_index &msg_type, const message_ref_t &message) const
 Deliver message for all subscribers. More...
 
void deliver_service_request (const std::type_index &msg_type, const message_ref_t &message) const
 Deliver service request. More...
 
bool operator== (const abstract_message_box_t &o) const SO_5_NOEXCEPT
 
bool operator< (const abstract_message_box_t &o) const SO_5_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 () SO_5_NOEXCEPT
 Default constructor. More...
 
 ~atomic_refcounted_t () SO_5_NOEXCEPT=default
 Destructor. More...
 
void inc_ref_count () SO_5_NOEXCEPT
 Increments reference count. More...
 
unsigned long dec_ref_count () SO_5_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, invocation_type_t demand_type)
 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, invocation_type_t demand_type)
 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 () const SO_5_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, invocation_type_t demand_type)
 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

◆ close()

template<typename Queue , typename Tracing_Base >
virtual void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::close ( close_mode_t  mode)
inlineoverridevirtual

Close the chain.

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,
invocation_type_t  demand_type 
)
inlineprivate

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

Note
Intented 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_enveloped_msg()

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

Deliver enveloped message.

Note
To keep source-code compatibility with previous versions this method is not pure virtual. It has an implementation that throws an exception with rc_not_implemented error code. This method will be marked as pure virtual in v.5.6.0
Since
v.5.5.23

Reimplemented from so_5::abstract_message_box_t.

◆ do_deliver_message()

template<typename Queue , typename Tracing_Base >
virtual 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 
) const
inlineoverridevirtual

Deliver message for all subscribers with respect to message limits.

Since
v.5.5.4
Note
It is obvious that do_deliver_message() must be non-const method. The constness is here now to keep compatibility in 5.5.* versions. The constness will be removed in v.5.6.0.

Implements so_5::abstract_message_box_t.

◆ do_deliver_message_from_timer()

template<typename Queue , typename Tracing_Base >
virtual 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.

◆ do_deliver_service_request()

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

Deliver service request.

Since
v.5.5.4
Note
It is obvious that do_deliver_message() must be non-const method. The constness is here now to keep compatibility in 5.5.* versions. The constness will be removed in v.5.6.0.

Implements so_5::abstract_message_box_t.

◆ drop_delivery_filter()

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

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 >
virtual 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 >
virtual environment_t& so_5::mchain_props::mchain_template< Queue, Tracing_Base >::environment ( ) const
inlineoverridevirtual

SObjectizer Environment for which the chain is created.

Implements so_5::abstract_message_chain_t.

◆ extract() [1/2]

template<typename Queue , typename Tracing_Base >
virtual 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 >
virtual 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.

Note
In v.5.5.16 this method has an implementation. It is done to keep compatibility with previous version. This implementation throws an exception.
This method is intended to be used by select_case_t.
Since
v.5.5.16

Reimplemented from 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 >
virtual 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 ( ) const
inlineprivate
Note
This method declared as const by the same reason as try_to_store_message_to_queue() method.
Since
v.5.5.16

◆ query_name()

template<typename Queue , typename Tracing_Base >
virtual 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 >
virtual void so_5::mchain_props::mchain_template< Queue, Tracing_Base >::remove_from_select ( select_case_t select_case)
inlineoverrideprotectedvirtual

Removement of mchain from multi chain select.

Note
In v.5.5.16 this method has an implementation. It is done to keep compatibility with previous version. This implementation throws an exception.
This method is intended to be used by select_case_t.
Attention
This method will be declared as pure virtual and noexcept in v.5.6.0.
Since
v.5.5.16

Reimplemented from so_5::abstract_message_chain_t.

◆ set_delivery_filter()

template<typename Queue , typename Tracing_Base >
virtual 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 >
virtual 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 >
virtual 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,
invocation_type_t  demand_type 
)
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,
invocation_type_t  demand_type 
)
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 >
virtual 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 >
virtual 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
mutableprivate

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
mutableprivate

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
mutableprivate

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
mutableprivate

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
mutableprivate

Condition variable for waiting on empty queue.


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