SynchronizedQueue: optional upper bound

git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1944 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
hsc
2012-11-20 15:01:55 +00:00
parent e409ae2f76
commit a26a155f0c

View File

@ -17,11 +17,15 @@ template <typename T>
class SynchronizedQueue { // Adapted from: http://www.quantnet.com/cplusplus-multithreading-boost/
private:
std::queue<T> m_queue; //!< Use STL queue to store data
unsigned capacity;
#ifndef __puma
boost::mutex m_mutex; //!< The mutex to synchronise on
boost::condition_variable m_cond; //!< The condition to wait for
boost::condition_variable m_cond_capacity; //!< Another condition to wait for
#endif
public:
SynchronizedQueue() : capacity(0) {}
SynchronizedQueue(unsigned capacity) : capacity(capacity) {}
int Size()
{
#ifndef __puma
@ -36,6 +40,13 @@ public:
#ifndef __puma
boost::unique_lock<boost::mutex> lock(m_mutex);
#endif
while (capacity != 0 && m_queue.size() >= capacity) {
#ifndef __puma
m_cond_capacity.wait(lock);
#endif
}
// Add the data to the queue
m_queue.push(data);
// Notify others that data is ready
@ -62,6 +73,13 @@ public:
#endif
// Retrieve the data from the queue
T result=m_queue.front(); m_queue.pop();
// Notify others that we have free slots
#ifndef __puma
if (m_queue.size() < capacity) {
m_cond_capacity.notify_one();
}
#endif
return result;
} // Lock is automatically released here
@ -84,7 +102,13 @@ public:
if (m_queue.size() > 0) {
// Retrieve the data from the queue
d = m_queue.front(); m_queue.pop();
return true;
// Notify others that we have free slots
#ifndef __puma
if (m_queue.size() < capacity) {
m_cond_capacity.notify_one();
}
#endif
return true;
} else {
return false;
}