TSDuck v3.38-3699
MPEG Transport Stream Toolkit
Loading...
Searching...
No Matches
ts::MessageQueue< MSG > Class Template Reference

Template message queue for inter-thread communication. More...

#include <tsMessageQueue.h>

Inheritance diagram for ts::MessageQueue< MSG >:

Public Types

using MessagePtr = std::shared_ptr< MSG >
 Safe pointer to messages.
 

Public Member Functions

 MessageQueue (size_t maxMessages=0)
 Constructor.
 
virtual ~MessageQueue ()
 Destructor.
 
void clear ()
 Clear the content of the queue.
 
void dequeue (MessagePtr &msg)
 Remove a message from the queue.
 
bool dequeue (MessagePtr &msg, cn::milliseconds timeout)
 Remove a message from the queue.
 
void enqueue (MessagePtr &msg)
 Insert a message in the queue.
 
bool enqueue (MessagePtr &msg, cn::milliseconds timeout)
 Insert a message in the queue.
 
void enqueue (MSG *msg)
 Insert a message in the queue.
 
bool enqueue (MSG *msg, cn::milliseconds timeout)
 Insert a message in the queue.
 
void forceEnqueue (MessagePtr &msg)
 Insert a message in the queue, even if the queue is full.
 
void forceEnqueue (MSG *msg)
 Insert a message in the queue, even if the queue is full.
 
size_t getMaxMessages () const
 Get the maximum allowed messages in the queue.
 
MessagePtr peek ()
 Peek the next message from the queue, without dequeueing it.
 
void setMaxMessages (size_t maxMessages)
 Change the maximum allowed messages in the queue.
 

Protected Types

using MessageList = std::list< MessagePtr >
 Queues are implemented as list of smart pointers to messages.
 

Protected Member Functions

virtual MessageList::iterator dequeuePlacement (MessageList &list)
 This virtual protected method performs dequeue location in the message queue.
 
virtual MessageList::iterator enqueuePlacement (const MessagePtr &msg, MessageList &list)
 This virtual protected method performs placement in the message queue.
 

Detailed Description

template<typename MSG>
class ts::MessageQueue< MSG >

Template message queue for inter-thread communication.

The ts::MessageQueue template class implements a synchronized access to a shared queue of generic messages.

Template Parameters
MSGThe type of the messages to exchange.

Member Typedef Documentation

◆ MessagePtr

template<typename MSG >
using ts::MessageQueue< MSG >::MessagePtr = std::shared_ptr<MSG>

Safe pointer to messages.

Since data are copied from the producer thread into the queue and later copied again from the queue into the consumer thread, the copied data is always a shared pointer to the actual message content.

Constructor & Destructor Documentation

◆ MessageQueue()

template<typename MSG >
ts::MessageQueue< MSG >::MessageQueue ( size_t  maxMessages = 0)

Constructor.

Parameters
[in]maxMessagesMaximum number of messages in the queue.
See also
setMaxMessages()

Member Function Documentation

◆ getMaxMessages()

template<typename MSG >
size_t ts::MessageQueue< MSG >::getMaxMessages ( ) const

Get the maximum allowed messages in the queue.

Returns
The maximum allowed messages in the queue (0 means unlimited).

◆ setMaxMessages()

template<typename MSG >
void ts::MessageQueue< MSG >::setMaxMessages ( size_t  maxMessages)

Change the maximum allowed messages in the queue.

Parameters
[in]maxMessagesMaximum number of messages in the queue. When a thread attempts to enqueue a message and the queue is full, the thread waits until at least one message is dequeued. If maxMessages is 0, the queue is unlimited. In that case, the logic of the application must ensure that the queue is bounded somehow, otherwise the queue may exhaust all the process memory.

◆ enqueue() [1/4]

template<typename MSG >
void ts::MessageQueue< MSG >::enqueue ( MessagePtr msg)

Insert a message in the queue.

If the queue is full, the calling thread waits until some space becomes available in the queue.

Parameters
[in,out]msgThe message to enqueue. The ownership of the pointed object is transfered to the message queue. Upon return, the msg safe pointer becomes a null pointer if the message was successfully enqueued.

◆ enqueue() [2/4]

template<typename MSG >
bool ts::MessageQueue< MSG >::enqueue ( MessagePtr msg,
cn::milliseconds  timeout 
)

Insert a message in the queue.

If the queue is full, the calling thread waits until some space becomes available in the queue or the timeout expires.

Parameters
[in,out]msgThe message to enqueue. The ownership of the pointed object is transfered to the message queue. Upon return, the msg safe pointer becomes a null pointer if the message was successfully enqueued (no timeout).
[in]timeoutMaximum time to wait in milliseconds.
Returns
True on success, false on error (queue still full after timeout).

◆ enqueue() [3/4]

template<typename MSG >
void ts::MessageQueue< MSG >::enqueue ( MSG *  msg)

Insert a message in the queue.

Parameters
[in]msgA pointer to the message to enqueue. This pointer shall not be owned by a safe pointer. When the message is successfully enqueued, the pointer becomes owned by a safe pointer and will be deallocated when no longer used.

◆ enqueue() [4/4]

template<typename MSG >
bool ts::MessageQueue< MSG >::enqueue ( MSG *  msg,
cn::milliseconds  timeout 
)

Insert a message in the queue.

Parameters
[in]msgA pointer to the message to enqueue. This pointer shall not be owned by a safe pointer. When the message is successfully enqueued, the pointer becomes owned by a safe pointer and will be deallocated when no longer used. In case of timeout, the object is not equeued and immediately deallocated.
[in]timeoutMaximum time to wait in milliseconds.
Returns
True on success, false on error (queue still full after timeout).

◆ forceEnqueue() [1/2]

template<typename MSG >
void ts::MessageQueue< MSG >::forceEnqueue ( MessagePtr msg)

Insert a message in the queue, even if the queue is full.

This method immediately inserts the message, even if the queue is full. This can be used to allow exceptional overflow of the queue with unique messages, to enqueue a message to instruct the consumer thread to terminate for instance.

Parameters
[in,out]msgThe message to enqueue. The ownership of the pointed object is transfered to the message queue. Upon return, the msg safe pointer becomes a null pointer.

◆ forceEnqueue() [2/2]

template<typename MSG >
void ts::MessageQueue< MSG >::forceEnqueue ( MSG *  msg)

Insert a message in the queue, even if the queue is full.

This method immediately inserts the message, even if the queue is full. This can be used to allow exceptional overflow of the queue with unique messages, to enqueue a message to instruct the consumer thread to terminate for instance.

Parameters
[in]msgA pointer to the message to enqueue. This pointer shall not be owned by a safe pointer. When the message is enqueued, the pointer becomes owned by a safe pointer and will be deallocated when no longer used.

◆ dequeue() [1/2]

template<typename MSG >
void ts::MessageQueue< MSG >::dequeue ( MessagePtr msg)

Remove a message from the queue.

Wait until a message is received.

Parameters
[out]msgReceived message.

◆ dequeue() [2/2]

template<typename MSG >
bool ts::MessageQueue< MSG >::dequeue ( MessagePtr msg,
cn::milliseconds  timeout 
)

Remove a message from the queue.

Wait until a message is received or the timeout expires.

Parameters
[out]msgReceived message.
[in]timeoutMaximum time to wait in milliseconds. If timeout is zero and the queue is empty, return immediately.
Returns
True on success, false on error (queue still empty after timeout).

◆ peek()

template<typename MSG >
ts::MessageQueue< MSG >::MessagePtr ts::MessageQueue< MSG >::peek ( )

Peek the next message from the queue, without dequeueing it.

If several threads simultaneously read from the queue, the returned message may be deqeued in the meantime by another thread.

Returns
A safe pointer to the first message in the queue or a null pointer if the queue is empty.

◆ enqueuePlacement()

template<typename MSG >
ts::MessageQueue< MSG >::MessageList::iterator ts::MessageQueue< MSG >::enqueuePlacement ( const MessagePtr msg,
MessageList list 
)
protectedvirtual

This virtual protected method performs placement in the message queue.

Parameters
[in]msgThe message to enqueue later. The message is not enqueued. Its value is used to compute the place where it should be inserted.
[in]listThe content of the queue.
Returns
An iterator to the place where msg shall be placed.

◆ dequeuePlacement()

template<typename MSG >
ts::MessageQueue< MSG >::MessageList::iterator ts::MessageQueue< MSG >::dequeuePlacement ( MessageList list)
protectedvirtual

This virtual protected method performs dequeue location in the message queue.

Parameters
[in]listThe content of the queue.
Returns
An iterator to the place from where the next message shall be removed.

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