using namespace icinga;
boost::mutex NagiosCheckTask::m_Mutex;
+vector<NagiosCheckTask::Ptr> NagiosCheckTask::m_PendingTasks;
deque<NagiosCheckTask::Ptr> NagiosCheckTask::m_Tasks;
condition_variable NagiosCheckTask::m_TasksCV;
void NagiosCheckTask::Enqueue(void)
{
time(&m_Result.StartTime);
-
- {
- mutex::scoped_lock lock(m_Mutex);
- m_Tasks.push_back(GetSelf());
- }
+ m_PendingTasks.push_back(GetSelf());
}
void NagiosCheckTask::FlushQueue(void)
{
- m_TasksCV.notify_all();
+ {
+ mutex::scoped_lock lock(m_Mutex);
+ std::copy(m_PendingTasks.begin(), m_PendingTasks.end(), back_inserter(m_Tasks));
+ m_PendingTasks.clear();
+ m_TasksCV.notify_all();
+ }
}
CheckResult NagiosCheckTask::GetResult(void)
{
CheckTask::RegisterType("nagios", NagiosCheckTask::CreateTask, NagiosCheckTask::FlushQueue);
- for (int i = 0; i < 1; i++) {
+ int numThreads = max(4, boost::thread::hardware_concurrency());
+
+ for (int i = 0; i < numThreads; i++) {
thread t(&NagiosCheckTask::CheckThreadProc);
t.detach();
}
static boost::mutex m_Mutex;
static deque<NagiosCheckTask::Ptr> m_Tasks;
+ static vector<NagiosCheckTask::Ptr> m_PendingTasks;
static condition_variable m_TasksCV;
static void CheckThreadProc(void);