UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
synchronized_queue< T, max_len > Class Template Reference

simple blocking synchronized queue More...

#include <synchronized_queue.h>

Inheritance diagram for synchronized_queue< T, max_len >:
Inheritance graph
Collaboration diagram for synchronized_queue< T, max_len >:
Collaboration graph

Public Member Functions

T pop (bool nonblocking=false)
 
void push (T &&message)
 
void push (T const &message)
 
int size ()
 
template<typename Rep , typename Period >
bool timed_pop (T &result, std::chrono::duration< Rep, Period > const &timeout)
 

Private Attributes

std::mutex m_lock
 
std::queue< T > m_queue
 
std::condition_variable m_queue_decremented
 
std::condition_variable m_queue_incremented
 

Detailed Description

template<typename T = struct msg *, int max_len = 1>
class synchronized_queue< T, max_len >

simple blocking synchronized queue

Queue blocks if it size is higher than max_len on push. It also blocks on pop call if there is no element in the queue.

Template Parameters
Ttype to be stored
max_lenmaximal length of the queue until it bloks (-1 means unlimited)

Definition at line 62 of file synchronized_queue.h.

Member Function Documentation

◆ pop()

template<typename T = struct msg *, int max_len = 1>
T synchronized_queue< T, max_len >::pop ( bool nonblocking = false)
inline

Definition at line 92 of file synchronized_queue.h.

93 {
94 std::unique_lock<std::mutex> l(m_lock);
95 if (m_queue.size() == 0 && nonblocking) {
96 return T();
97 }
98
99 m_queue_incremented.wait(l, [this]{return m_queue.size() > 0;});
100 T ret = std::move(m_queue.front());
101 m_queue.pop();
102
103 l.unlock();
104 m_queue_decremented.notify_one();
105 return ret;
106 }
std::queue< T > m_queue
std::condition_variable m_queue_decremented
std::condition_variable m_queue_incremented

References synchronized_queue< T, max_len >::m_lock, synchronized_queue< T, max_len >::m_queue, synchronized_queue< T, max_len >::m_queue_decremented, and synchronized_queue< T, max_len >::m_queue_incremented.

Referenced by compress_pop(), decode_video_frame(), decompress_thread(), and fec_thread().

◆ push() [1/2]

template<typename T = struct msg *, int max_len = 1>
void synchronized_queue< T, max_len >::push ( T && message)
inline

Definition at line 81 of file synchronized_queue.h.

82 {
83 std::unique_lock<std::mutex> l(m_lock);
84 if (max_len != -1) {
85 m_queue_decremented.wait(l, [this]{return m_queue.size() < (unsigned int) max_len;});
86 }
87 m_queue.push(std::move(message));
88 l.unlock();
89 m_queue_incremented.notify_one();
90 }

References synchronized_queue< T, max_len >::m_lock, synchronized_queue< T, max_len >::m_queue, synchronized_queue< T, max_len >::m_queue_decremented, and synchronized_queue< T, max_len >::m_queue_incremented.

◆ push() [2/2]

template<typename T = struct msg *, int max_len = 1>
void synchronized_queue< T, max_len >::push ( T const & message)
inline

Definition at line 70 of file synchronized_queue.h.

71 {
72 std::unique_lock<std::mutex> l(m_lock);
73 if (max_len != -1) {
74 m_queue_decremented.wait(l, [this]{return m_queue.size() < (unsigned int) max_len;});
75 }
76 m_queue.push(message);
77 l.unlock();
78 m_queue_incremented.notify_one();
79 }

References synchronized_queue< T, max_len >::m_lock, synchronized_queue< T, max_len >::m_queue, synchronized_queue< T, max_len >::m_queue_decremented, and synchronized_queue< T, max_len >::m_queue_incremented.

Referenced by compress_frame(), decode_video_frame(), decompress_thread(), fec_thread(), and video_decoder_stop_threads().

◆ size()

template<typename T = struct msg *, int max_len = 1>
int synchronized_queue< T, max_len >::size ( )
inline

Definition at line 64 of file synchronized_queue.h.

65 {
66 std::unique_lock<std::mutex> l(m_lock);
67 return m_queue.size();
68 }

References synchronized_queue< T, max_len >::m_lock, and synchronized_queue< T, max_len >::m_queue.

◆ timed_pop()

template<typename T = struct msg *, int max_len = 1>
template<typename Rep , typename Period >
bool synchronized_queue< T, max_len >::timed_pop ( T & result,
std::chrono::duration< Rep, Period > const & timeout )
inline

Definition at line 109 of file synchronized_queue.h.

110 {
111 std::unique_lock<std::mutex> l(m_lock);
112 if (!m_queue_incremented.wait_for(l, timeout, [this]{return m_queue.size() > 0;})) {
113 return false;
114 }
115 result = std::move(m_queue.front());
116 m_queue.pop();
117 l.unlock();
118 m_queue_decremented.notify_one();
119 return true;
120 }

References synchronized_queue< T, max_len >::m_lock, synchronized_queue< T, max_len >::m_queue, synchronized_queue< T, max_len >::m_queue_decremented, and synchronized_queue< T, max_len >::m_queue_incremented.

Member Data Documentation

◆ m_lock

◆ m_queue

◆ m_queue_decremented

template<typename T = struct msg *, int max_len = 1>
std::condition_variable synchronized_queue< T, max_len >::m_queue_decremented
private

◆ m_queue_incremented

template<typename T = struct msg *, int max_len = 1>
std::condition_variable synchronized_queue< T, max_len >::m_queue_incremented
private

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