AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
ProducerConsumerQueue< T > Class Template Reference

#include "PCQueue.h"

Public Member Functions

 ProducerConsumerQueue ()=default
 
void Push (const T &value)
 
bool Empty () const
 
std::size_t Size () const
 
bool Pop (T &value)
 
void WaitAndPop (T &value)
 
void Cancel ()
 
void Shutdown ()
 

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 > _cancel {}
 
std::atomic< bool > _shutdown {}
 

Detailed Description

template<typename T>
class ProducerConsumerQueue< T >

Constructor & Destructor Documentation

◆ ProducerConsumerQueue()

template<typename T >
ProducerConsumerQueue< T >::ProducerConsumerQueue ( )
default

Member Function Documentation

◆ Cancel()

template<typename T >
void ProducerConsumerQueue< T >::Cancel ( )
inline
87 {
88 std::lock_guard<std::mutex> lock(_queueLock);
89 while (!_queue.empty()) {
90 T& value = _queue.front();
91 DeleteQueuedObject(value);
92 _queue.pop();
93 }
94 _cancel = true;
95 _condition.notify_all();
96 }
std::mutex _queueLock
Definition PCQueue.h:30
std::atomic< bool > _cancel
Definition PCQueue.h:33
std::queue< T > _queue
Definition PCQueue.h:31
std::condition_variable _condition
Definition PCQueue.h:32
std::enable_if< std::is_pointer< E >::value >::type DeleteQueuedObject(E &obj)
Definition PCQueue.h:107

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

Referenced by MapUpdater::deactivate(), and AuctionHouseSearcher::~AuctionHouseSearcher().

◆ 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
108 {
109 delete obj;
110 }

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

◆ 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
113{ }

◆ Empty()

template<typename T >
bool ProducerConsumerQueue< T >::Empty ( ) const
inline
49 {
50 std::lock_guard<std::mutex> lock(_queueLock);
51 return _queue.empty();
52 }

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

◆ Pop()

template<typename T >
bool ProducerConsumerQueue< T >::Pop ( T &  value)
inline
61 {
62 std::lock_guard<std::mutex> lock(_queueLock);
63 if (_queue.empty() || _cancel)
64 return false;
65
66 value = std::move(_queue.front());
67 _queue.pop();
68 return true;
69 }

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

Referenced by AuctionHouseWorkerThread::ProcessSearchRequests().

◆ Push()

template<typename T >
void ProducerConsumerQueue< T >::Push ( const T &  value)
inline
40 {
41 {
42 std::lock_guard<std::mutex> lock(_queueLock);
43 _queue.push(std::move(value));
44 }
45 _condition.notify_one();
46 }

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

Referenced by AuctionHouseSearcher::QueueSearchRequest(), and MapUpdater::schedule_task().

◆ Shutdown()

template<typename T >
void ProducerConsumerQueue< T >::Shutdown ( )
inline
100 {
101 _shutdown = true;
102 _condition.notify_all();
103 }
std::atomic< bool > _shutdown
Definition PCQueue.h:34

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

◆ Size()

template<typename T >
std::size_t ProducerConsumerQueue< T >::Size ( ) const
inline
55 {
56 std::lock_guard<std::mutex> lock(_queueLock);
57 return _queue.size();
58 }

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

◆ WaitAndPop()

template<typename T >
void ProducerConsumerQueue< T >::WaitAndPop ( T &  value)
inline
72 {
73 std::unique_lock<std::mutex> lock(_queueLock);
74
75 // Wait for the queue to have an element or the cancel/shutdown flag
76 _condition.wait(lock, [this] { return !_queue.empty() || _cancel || _shutdown; });
77
78 if (_queue.empty() || _cancel)
79 return;
80
81 value = std::move(_queue.front());
82 _queue.pop();
83 }

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

Referenced by DatabaseWorker::WorkerThread(), and MapUpdater::WorkerThread().

Member Data Documentation

◆ _cancel

template<typename T >
std::atomic<bool> ProducerConsumerQueue< T >::_cancel {}
private

◆ _condition

◆ _queue

◆ _queueLock

◆ _shutdown

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

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