notify all waiting threads in add(), added waitRemove(), cosmetics

This commit is contained in:
john30
2014-12-27 12:33:10 +01:00
parent ffb71a56d3
commit 8d835ed7a9
+33 -7
View File
@@ -63,7 +63,7 @@ public:
m_queue.push_back(item);
pthread_cond_signal(&m_cond);
pthread_cond_broadcast(&m_cond);
pthread_mutex_unlock(&m_mutex);
}
@@ -95,23 +95,49 @@ public:
}
/**
* @brief Remove the specified item from queue.
* @brief Remove the specified item from the queue.
* @param item the item to remove.
* @return whether the item was removed.
*/
bool remove(T item)
{
pthread_mutex_lock(&m_mutex);
int oldSize = m_queue.size();
size_t oldSize = m_queue.size();
if (oldSize > 0)
m_queue.remove(item);
int newSize = m_queue.size();
size_t newSize = m_queue.size();
pthread_mutex_unlock(&m_mutex);
return newSize != oldSize;
}
/**
* @brief return the first item from queue without remove.
* @brief Wait for the specified item to appear in the queue and remove it from the queue.
* @param item the item to wait for and remove.
* @return whether the item was removed.
*/
bool waitRemove(T item)
{
pthread_mutex_lock(&m_mutex);
do {
size_t oldSize = m_queue.size();
if (oldSize > 0) {
m_queue.remove(item);
if (m_queue.size() != oldSize)
break;
}
pthread_cond_wait(&m_cond, &m_mutex);
} while (true);
pthread_mutex_unlock(&m_mutex);
return true;
}
/**
* @brief return the first item from the queue without remove.
* @param wait whether to wait for an entry if the queue is empty.
* @return the item, or NULL if no item is available and wait was false.
*/
@@ -139,11 +165,11 @@ public:
* @brief the number of entries inside queue.
* @return the size.
*/
int size()
size_t size()
{
pthread_mutex_lock(&m_mutex);
int size = m_queue.size();
size_t size = m_queue.size();
pthread_mutex_unlock(&m_mutex);