Horizon Official Technical Documentation
ProducerConsumerQueue< T > Class Template Reference

#include <ProducerConsumerQueue.hpp>

Public Member Functions

 ProducerConsumerQueue ()
 
void Push (const T &value)
 
bool Empty ()
 
bool Pop (T &value)
 
void WaitAndPop (T &value)
 
void Cancel ()
 

Private Member Functions

template<typename E = T>
std::enable_if< std::is_pointer< E >::value >::type DeleteQueuedObject (E &obj)
 
template<typename E = T>
std::enable_if<!std::is_pointer< E >::value >::type DeleteQueuedObject (E const &)
 

Private Attributes

std::mutex _queueLock
 
std::queue< T > _queue
 
std::condition_variable _condition
 
std::atomic< bool > _shutdown
 

Constructor & Destructor Documentation

◆ ProducerConsumerQueue()

template<typename T >
ProducerConsumerQueue< T >::ProducerConsumerQueue ( )
inline
50: _shutdown(false) { }
std::atomic< bool > _shutdown
Definition: ProducerConsumerQueue.hpp:46

Member Function Documentation

◆ Cancel()

template<typename T >
void ProducerConsumerQueue< T >::Cancel ( )
inline
99 {
100 std::unique_lock<std::mutex> lock(_queueLock);
101
102 while (!_queue.empty())
103 {
104 T& value = _queue.front();
105
106 DeleteQueuedObject(value);
107
108 _queue.pop();
109 }
110
111 _shutdown = true;
112
113 _condition.notify_all();
114 }
std::mutex _queueLock
Definition: ProducerConsumerQueue.hpp:43
std::queue< T > _queue
Definition: ProducerConsumerQueue.hpp:44
std::condition_variable _condition
Definition: ProducerConsumerQueue.hpp:45
std::enable_if< std::is_pointer< E >::value >::type DeleteQueuedObject(E &obj)
Definition: ProducerConsumerQueue.hpp:118

References ProducerConsumerQueue< T >::_condition, ProducerConsumerQueue< T >::_queue, ProducerConsumerQueue< T >::_queueLock, ProducerConsumerQueue< T >::_shutdown, and ProducerConsumerQueue< T >::DeleteQueuedObject().

+ Here is the call graph for this function:

◆ DeleteQueuedObject() [1/2]

template<typename T >
template<typename E = T>
std::enable_if< std::is_pointer< E >::value >::type ProducerConsumerQueue< T >::DeleteQueuedObject ( E &  obj)
inlineprivate
118{ delete obj; }

Referenced by ProducerConsumerQueue< T >::Cancel().

+ Here is the caller graph for this function:

◆ DeleteQueuedObject() [2/2]

template<typename T >
template<typename E = T>
std::enable_if<!std::is_pointer< E >::value >::type ProducerConsumerQueue< T >::DeleteQueuedObject ( E const &  )
inlineprivate
121{ }

◆ Empty()

template<typename T >
bool ProducerConsumerQueue< T >::Empty ( )
inline
61 {
62 std::lock_guard<std::mutex> lock(_queueLock);
63
64 return _queue.empty();
65 }

References ProducerConsumerQueue< T >::_queue, and ProducerConsumerQueue< T >::_queueLock.

◆ Pop()

template<typename T >
bool ProducerConsumerQueue< T >::Pop ( T &  value)
inline
68 {
69 std::lock_guard<std::mutex> lock(_queueLock);
70
71 if (_queue.empty() || _shutdown)
72 return false;
73
74 value = _queue.front();
75
76 _queue.pop();
77
78 return true;
79 }

References ProducerConsumerQueue< T >::_queue, ProducerConsumerQueue< T >::_queueLock, and ProducerConsumerQueue< T >::_shutdown.

◆ Push()

template<typename T >
void ProducerConsumerQueue< T >::Push ( const T &  value)
inline
53 {
54 std::lock_guard<std::mutex> lock(_queueLock);
55 _queue.push(std::move(value));
56
57 _condition.notify_one();
58 }

References ProducerConsumerQueue< T >::_condition, ProducerConsumerQueue< T >::_queue, and ProducerConsumerQueue< T >::_queueLock.

◆ WaitAndPop()

template<typename T >
void ProducerConsumerQueue< T >::WaitAndPop ( T &  value)
inline
82 {
83 std::unique_lock<std::mutex> lock(_queueLock);
84
85 // we could be using .wait(lock, predicate) overload here but it is broken
86 // https://connect.microsoft.com/VisualStudio/feedback/details/1098841
87 while (_queue.empty() && !_shutdown)
88 _condition.wait(lock);
89
90 if (_queue.empty() || _shutdown)
91 return;
92
93 value = _queue.front();
94
95 _queue.pop();
96 }

References ProducerConsumerQueue< T >::_condition, ProducerConsumerQueue< T >::_queue, ProducerConsumerQueue< T >::_queueLock, and ProducerConsumerQueue< T >::_shutdown.

Member Data Documentation

◆ _condition

template<typename T >
std::condition_variable ProducerConsumerQueue< T >::_condition
private

◆ _queue

◆ _queueLock

◆ _shutdown

template<typename T >
std::atomic<bool> ProducerConsumerQueue< T >::_shutdown
private

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