aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Threading/ProducerConsumerQueue.h
diff options
context:
space:
mode:
authorleak <leak@bitmx.net>2014-06-30 18:37:23 +0200
committerleak <leak@bitmx.net>2014-06-30 18:37:23 +0200
commitd39a013b6b979a5158bf86c37a197cb902b2c2f9 (patch)
treed39b71809197052500bdbc7399276aa15dd96ee8 /src/server/shared/Threading/ProducerConsumerQueue.h
parent9588c1d92b20573c2bd214b44a15e41fd8cf35b4 (diff)
Replaced ACE_Task_Base based DatabaseWorker with PCQ
Note: Not exactly sure how shutdown should be handled, currently the queue clears itself out before shutting down This might need to be changed if the queue should be fully processed before being deleted
Diffstat (limited to 'src/server/shared/Threading/ProducerConsumerQueue.h')
-rw-r--r--src/server/shared/Threading/ProducerConsumerQueue.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/server/shared/Threading/ProducerConsumerQueue.h b/src/server/shared/Threading/ProducerConsumerQueue.h
index 961cb9f9c82..41bff445c2e 100644
--- a/src/server/shared/Threading/ProducerConsumerQueue.h
+++ b/src/server/shared/Threading/ProducerConsumerQueue.h
@@ -21,6 +21,7 @@
#include <condition_variable>
#include <mutex>
#include <queue>
+#include <atomic>
template <typename T>
class ProducerConsumerQueue
@@ -29,9 +30,12 @@ private:
std::mutex _queueLock;
std::queue<T> _queue;
std::condition_variable _condition;
+ std::atomic<bool> _shutdown;
public:
+ ProducerConsumerQueue<T>() : _shutdown(false) { }
+
void Push(const T& value)
{
_queueLock.lock();
@@ -68,7 +72,10 @@ public:
{
std::unique_lock<std::mutex> lock(_queueLock);
- _condition.wait(lock, [this](){ return !_queue.empty(); });
+ while (_queue.empty() && !_shutdown)
+ {
+ _condition.wait(lock);
+ }
if (_queue.empty())
return;
@@ -91,6 +98,8 @@ public:
_queue.pop();
}
+ _shutdown = true;
+
_queueLock.unlock();
_condition.notify_all();