]> granicus.if.org Git - icinga2/blobdiff - lib/icinga/hostgroup.cpp
Various bugfixes.
[icinga2] / lib / icinga / hostgroup.cpp
index e259d445b96d040948591e0a453e8f5c6c982a08..a769736a497995b8b6c877c279cee0953c2c0984 100644 (file)
@@ -23,7 +23,8 @@ using namespace icinga;
 
 boost::mutex HostGroup::m_Mutex;
 map<String, vector<Host::WeakPtr> > HostGroup::m_MembersCache;
-bool HostGroup::m_MembersCacheValid = true;
+bool HostGroup::m_MembersCacheNeedsUpdate = false;
+Timer::Ptr HostGroup::m_MembersCacheTimer;
 
 REGISTER_TYPE(HostGroup);
 
@@ -120,10 +121,17 @@ void HostGroup::InvalidateMembersCache(void)
 {
        boost::mutex::scoped_lock lock(m_Mutex);
 
-       if (m_MembersCacheValid)
-               Utility::QueueAsyncCallback(boost::bind(&HostGroup::RefreshMembersCache));
+       if (m_MembersCacheNeedsUpdate)
+               return; /* Someone else has already requested a refresh. */
 
-       m_MembersCacheValid = false;
+       if (!m_MembersCacheTimer) {
+               m_MembersCacheTimer = boost::make_shared<Timer>();
+               m_MembersCacheTimer->SetInterval(0.5);
+               m_MembersCacheTimer->OnTimerExpired.connect(boost::bind(&HostGroup::RefreshMembersCache));
+       }
+
+       m_MembersCacheTimer->Start();
+       m_MembersCacheNeedsUpdate = true;
 }
 
 /**
@@ -134,10 +142,9 @@ void HostGroup::RefreshMembersCache(void)
        {
                boost::mutex::scoped_lock lock(m_Mutex);
 
-               if (m_MembersCacheValid)
-                       return;
-
-               m_MembersCacheValid = true;
+               assert(m_MembersCacheNeedsUpdate);
+               m_MembersCacheTimer->Stop();
+               m_MembersCacheNeedsUpdate = false;
        }
 
        map<String, vector<Host::WeakPtr> > newMembersCache;