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; 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 // Returns object T when available
// Throws std::exception on timeout or when interrupted // Throws std::exception on timeout or when interrupted
T Pop(int milliSeconds = INFINITE) T Pop(int milliSeconds = INFINITE)
@ -114,9 +158,9 @@ private:
// wait for event to be signaled that there is data // wait for event to be signaled that there is data
if (bThrowException) if (bThrowException)
{ {
m_dataAvailableEvent.WaitEvtEx(milliSeconds); m_dataAvailableEvent.WaitEvtEx(remaining);
} }
else if (!m_dataAvailableEvent.WaitEvt(milliSeconds)) else if (!m_dataAvailableEvent.WaitEvt(remaining))
{ {
return false; return false;
} }

Loading…
Cancel
Save