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);
{
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;
}
/**
{
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;