Adding PushFront to ConcurrentQueue.h

Change-Id: I4b4410ab6209e265436e3bff381fba7989729b98
REL_2_3 v2.1.0.3
Peter Bruin 12 years ago
parent 5c5ed1d97e
commit c349c8471e

@ -66,6 +66,50 @@ public:
return true;
}
// Pushes object T when space is available
// Throws std::exception on timeout or when interrupted
bool PushFront(T item, int milliSeconds = INFINITE) {
bool bPushedItem = false;
CSingleLock lock(&m_mutex);
while(!bPushedItem) {
try
{
// Wait for space to be available
m_spaceAvailableEvent.WaitEvtEx(milliSeconds);
} catch(std::exception &e) {
printf("Push failed: %s\n", e.what());
throw;
}
// wait for critical section to become available
lock.Lock();
// inside critical section
{
size_t size = m_queue.size();
// Make sure that nobody else that was waiting pushed first
if( size < m_capacity) {
m_queue.push_front(item);
bPushedItem = true;
if (size == 0)
{
// Queue was empty, now there is one item
m_dataAvailableEvent.Set();
}
size++;
if (size >= m_capacity) {
// Queue is now full
m_spaceAvailableEvent.Reset();
}
}
}
lock.Unlock();
}
return true;
}
// Returns object T when available
// Throws std::exception on timeout or when interrupted
T Pop(int milliSeconds = INFINITE)
@ -114,9 +158,9 @@ private:
// wait for event to be signaled that there is data
if (bThrowException)
{
m_dataAvailableEvent.WaitEvtEx(milliSeconds);
m_dataAvailableEvent.WaitEvtEx(remaining);
}
else if (!m_dataAvailableEvent.WaitEvt(milliSeconds))
else if (!m_dataAvailableEvent.WaitEvt(remaining))
{
return false;
}

Loading…
Cancel
Save