public List<GroupRoleMembersData> GetGroupRoleMembers(string RequestingAgentID, UUID GroupID, RoleMembersListDelegate d) { object rmembers = null; bool firstCall = false; // we need to key in also on the requester, because different ppl have different view privileges string cacheKey = "rolemembers-" + RequestingAgentID.ToString() + "-" + GroupID.ToString(); //m_log.DebugFormat("[XXX]: GetGroupRoleMembers {0}", cacheKey); while (true) { lock (m_Cache) { if (m_Cache.TryGetValue(cacheKey, out rmembers)) { List<ExtendedGroupRoleMembersData> xx = (List<ExtendedGroupRoleMembersData>)rmembers; return xx.ConvertAll<GroupRoleMembersData>(m_ForeignImporter.ConvertGroupRoleMembersData); } // not cached if (!m_ActiveRequests.ContainsKey(cacheKey)) { m_ActiveRequests.Add(cacheKey, true); firstCall = true; } } if (firstCall) { try { List<ExtendedGroupRoleMembersData> _rmembers = d(); if (_rmembers != null && _rmembers.Count > 0) rmembers = _rmembers.ConvertAll<GroupRoleMembersData>(new Converter<ExtendedGroupRoleMembersData, GroupRoleMembersData>(m_ForeignImporter.ConvertGroupRoleMembersData)); else rmembers = new List<GroupRoleMembersData>(); lock (m_Cache) { // For some strange reason, when I cache the list of GroupRoleMembersData, // it gets emptied out. The TryGet gets an empty list... //m_Cache.AddOrUpdate(cacheKey, rmembers, GROUPS_CACHE_TIMEOUT); // Caching the list of ExtendedGroupRoleMembersData doesn't show that issue // I don't get it. m_Cache.AddOrUpdate(cacheKey, _rmembers, GROUPS_CACHE_TIMEOUT); return (List<GroupRoleMembersData>)rmembers; } } finally { m_ActiveRequests.Remove(cacheKey); } } else Thread.Sleep(50); } }
public List <GroupRoleMembersData> GetGroupRoleMembers(string RequestingAgentID, UUID GroupID, RoleMembersListDelegate d) { object rmembers = null; bool firstCall = false; // we need to key in also on the requester, because different ppl have different view privileges string cacheKey = "rolemembers-" + RequestingAgentID.ToString() + "-" + GroupID.ToString(); //m_log.DebugFormat("[XXX]: GetGroupRoleMembers {0}", cacheKey); while (true) { lock (m_Cache) { if (m_Cache.TryGetValue(cacheKey, out rmembers)) { List <ExtendedGroupRoleMembersData> xx = (List <ExtendedGroupRoleMembersData>)rmembers; return(xx.ConvertAll <GroupRoleMembersData>(m_ForeignImporter.ConvertGroupRoleMembersData)); } // not cached if (!m_ActiveRequests.ContainsKey(cacheKey)) { m_ActiveRequests.Add(cacheKey, true); firstCall = true; } } if (firstCall) { List <ExtendedGroupRoleMembersData> _rmembers = d(); if (_rmembers != null && _rmembers.Count > 0) { rmembers = _rmembers.ConvertAll <GroupRoleMembersData>(new Converter <ExtendedGroupRoleMembersData, GroupRoleMembersData>(m_ForeignImporter.ConvertGroupRoleMembersData)); } else { rmembers = new List <GroupRoleMembersData>(); } lock (m_Cache) { // For some strange reason, when I cache the list of GroupRoleMembersData, // it gets emptied out. The TryGet gets an empty list... //m_Cache.AddOrUpdate(cacheKey, rmembers, GROUPS_CACHE_TIMEOUT); // Caching the list of ExtendedGroupRoleMembersData doesn't show that issue // I don't get it. m_Cache.AddOrUpdate(cacheKey, _rmembers, GROUPS_CACHE_TIMEOUT); m_ActiveRequests.Remove(cacheKey); return((List <GroupRoleMembersData>)rmembers); } } else { Thread.Sleep(50); } } }