using namespace icinga;
+WorkQueue::WorkQueue(size_t maxItems)
+ : m_MaxItems(maxItems)
+{ }
+
WorkQueue::~WorkQueue(void)
{
Join();
void WorkQueue::Enqueue(const WorkCallback& item)
{
boost::mutex::scoped_lock lock(m_Mutex);
+
+ while (m_Items.size() >= m_MaxItems)
+ m_CV.wait(lock);
+
m_Items.push_back(item);
m_CV.notify_all();
try {
WorkCallback wi = m_Items.front();
m_Items.pop_front();
+ m_CV.notify_all();
lock.unlock();
wi();
public:
typedef boost::function<void (void)> WorkCallback;
+ WorkQueue(size_t maxItems = 25000);
~WorkQueue(void);
void Enqueue(const WorkCallback& item);
private:
boost::mutex m_Mutex;
boost::condition_variable m_CV;
+ size_t m_MaxItems;
bool m_Executing;
std::deque<WorkCallback> m_Items;