10#ifdef RDK_BUILD_THREADSAFE_SSS
11#ifndef CONCURRENT_QUEUE
12#define CONCURRENT_QUEUE
13#include <condition_variable>
19class ConcurrentQueue {
21 unsigned int d_capacity;
23 std::vector<E> d_elements;
24 unsigned int d_head, d_tail;
25 mutable std::mutex d_lock;
26 std::condition_variable d_notEmpty, d_notFull;
29 ConcurrentQueue(
const ConcurrentQueue<E> &);
30 ConcurrentQueue &operator=(
const ConcurrentQueue<E> &);
33 ConcurrentQueue(
unsigned int capacity)
34 : d_capacity(capacity), d_done(false), d_head(0), d_tail(0) {
35 std::vector<E> elements(capacity);
36 d_elements = elements;
42 void push(
const E &element);
64void ConcurrentQueue<E>::push(
const E &element) {
65 std::unique_lock<std::mutex> lk(d_lock);
69 while (d_head + d_capacity == d_tail) {
72 bool wasEmpty = (d_head == d_tail);
73 d_elements.at(d_tail % d_capacity) = element;
79 d_notEmpty.notify_all();
84bool ConcurrentQueue<E>::pop(E &element) {
85 std::unique_lock<std::mutex> lk(d_lock);
88 while (d_head == d_tail) {
94 bool wasFull = (d_head + d_capacity == d_tail);
95 element = d_elements.at(d_head % d_capacity);
101 d_notFull.notify_all();
107bool ConcurrentQueue<E>::isEmpty()
const {
108 std::unique_lock<std::mutex> lk(d_lock);
109 return (d_head == d_tail);
113bool ConcurrentQueue<E>::getDone()
const {
114 std::unique_lock<std::mutex> lk(d_lock);
119void ConcurrentQueue<E>::setDone() {
120 std::unique_lock<std::mutex> lk(d_lock);
122 d_notEmpty.notify_all();
126void ConcurrentQueue<E>::clear() {
127 std::unique_lock<std::mutex> lk(d_lock);