29 struct DataContainerCompare
31 bool operator()(
const DataContainer &a,
const DataContainer &b)
const
33 if (a.data->GetPriority () < b.data->GetPriority ())
37 else if (a.data->GetPriority () > b.data->GetPriority ())
43 return a.index > b.index;
48 typedef std::priority_queue<DataContainer, bvector<DataContainer>, DataContainerCompare> DataContainerQueue;
50 DataContainerQueue m_queue;
55 DataContainerQueue
const& m_queue;
58 EmptyQueuePredicate(DataContainerQueue
const& queue,
bool expectedEmpty) : m_queue(queue), m_expectedEmpty(expectedEmpty) {}
59 virtual bool _TestCondition(
BeConditionVariable &cv)
override {
return m_expectedEmpty==m_queue.empty (); }
83 DataContainer dataContainer;
84 dataContainer.data = data;
85 dataContainer.index = m_queueIndex++;
87 m_queue.push (dataContainer);
89 m_isNotEmptyCV.notify_one ();
95 return ProtectedEmpty ();
100 return m_queue.empty ();
106 return (
int)m_queue.size ();
112 ProtectedWaitAndPop (poppedValue);
118 return ProtectedTryPop (poppedValue);
123 if (m_queue.empty ())
128 DataContainer dataContainer = m_queue.top ();
131 poppedValue = dataContainer.data;
139 EmptyQueuePredicate predicate(m_queue,
false);
140 m_isNotEmptyCV.ProtectedWaitOnCondition(lk, &predicate, BeConditionVariable::Infinite);
142 DataContainer dataContainer = m_queue.top ();
145 poppedValue = dataContainer.data;
147 if (m_queue.empty ())
148 m_isEmptyCV.notify_all ();
153 EmptyQueuePredicate predicate(m_queue,
true);
154 m_isEmptyCV.WaitOnCondition(&predicate, BeConditionVariable::Infinite);
A synchronization primitive that can be used to block a thread, or multiple threads at the same time...
Definition: BeThread.h:132
bool ProtectedTryPop(D &poppedValue)
Definition: ConcurrentQueue.h:121
void WaitUntilEmpty() const
Definition: ConcurrentQueue.h:151
A BeMutex ownership wrapper.
Definition: BeThread.h:82
bool Empty() const
Definition: ConcurrentQueue.h:92
Definition: ConcurrentQueue.h:20
void ProtectedWaitAndPop(D &poppedValue, BeMutexHolder &lk)
Definition: ConcurrentQueue.h:137
unsigned long long uint64_t
Definition: Bentley.r.h:95
#define BEGIN_BENTLEY_TASKS_NAMESPACE
Definition: Tasks.h:13
BeMutex & GetMutex() const
Definition: ConcurrentQueue.h:74
bool TryPop(D &poppedValue)
Definition: ConcurrentQueue.h:115
int Size() const
Definition: ConcurrentQueue.h:103
Defines typedefs and constants that can be used across other namespaces. All Bentley-authored C++ sou...
void WaitAndPop(D &poppedValue)
Definition: ConcurrentQueue.h:109
bool ProtectedEmpty() const
Definition: ConcurrentQueue.h:98
A synchronization primitive that can be used to protect shared data from being simultaneously accesse...
Definition: BeThread.h:57
void Push(const D &data)
Definition: ConcurrentQueue.h:79
ConcurrentQueue()
Definition: ConcurrentQueue.h:69
#define END_BENTLEY_TASKS_NAMESPACE
Definition: Tasks.h:14
Provides implementation of predicate for a BeConditionVariable.
Definition: BeThread.h:117