diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs index e2d960b17b..6edf46d6a2 100644 --- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs @@ -49,6 +49,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp public class UrlData { public UUID hostID; + public UUID groupID; public UUID itemID; public IScriptModule engine; public string url; @@ -86,11 +87,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); - protected Dictionary m_RequestMap = - new Dictionary(); + protected readonly Dictionary m_RequestMap = new Dictionary(); + protected readonly Dictionary m_UrlMap = new Dictionary(); + protected readonly Dictionary m_countsPerSOG = new Dictionary(); - protected Dictionary m_UrlMap = - new Dictionary(); protected bool m_enabled = false; protected string m_ErrorStr; @@ -241,8 +241,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp } string url = "http://" + ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/"; + UUID groupID = host.ParentGroup.UUID; UrlData urlData = new UrlData(); urlData.hostID = host.UUID; + urlData.groupID = groupID; urlData.itemID = itemID; urlData.engine = engine; urlData.url = url; @@ -257,6 +259,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp m_UrlMap[url] = urlData; + if (m_countsPerSOG.TryGetValue(groupID, out int urlcount)) + m_countsPerSOG[groupID] = ++urlcount; + else + m_countsPerSOG[groupID] = 1; + string uri = "/lslhttp/" + urlcode.ToString(); PollServiceEventArgs args @@ -300,8 +307,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp } string url = "https://" + ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + "/lslhttps/" + urlcode.ToString() + "/"; + UUID groupID = host.ParentGroup.UUID; UrlData urlData = new UrlData(); urlData.hostID = host.UUID; + urlData.groupID = groupID; urlData.itemID = itemID; urlData.engine = engine; urlData.url = url; @@ -315,6 +324,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp m_UrlMap[url] = urlData; + if (m_countsPerSOG.TryGetValue(groupID, out int urlcount)) + m_countsPerSOG[groupID] = ++urlcount; + else + m_countsPerSOG[groupID] = 1; + string uri = "/lslhttps/" + urlcode.ToString(); PollServiceEventArgs args @@ -496,6 +510,15 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp m_HttpsServer.RemovePollServiceHTTPHandler("", "/lslhttps/"+data.urlcode.ToString()+"/"); else m_HttpServer.RemovePollServiceHTTPHandler("", "/lslhttp/"+data.urlcode.ToString()+"/"); + + if(m_countsPerSOG.TryGetValue(data.groupID, out int count)) + { + --count; + if(count <= 0) + m_countsPerSOG.Remove(data.groupID); + else + m_countsPerSOG[data.groupID] = count; + } } protected Hashtable NoEvents(UUID requestID, UUID sessionID) @@ -774,18 +797,23 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp public Dictionary GetUrlCountForHosts() { - Dictionary dict = new Dictionary(); - foreach(var data in m_UrlMap) - { - int count = 0; - if(dict.ContainsKey(data.Value.hostID)) - { - count = dict[data.Value.hostID]; - } - count++; - dict[data.Value.hostID] = count; + if (!m_enabled) + return new Dictionary(); + + lock (m_UrlMap) + return new Dictionary(m_countsPerSOG); + } + + public int GetUrlCount(UUID groupID) + { + if (!m_enabled) + return 0; + + lock (m_UrlMap) + { + m_countsPerSOG.TryGetValue(groupID, out int count); + return count; } - return dict; } } } diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index b4a0cb915d..73a61096d5 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -1434,10 +1434,7 @@ namespace OpenSim.Region.CoreModules.World.Estate if(sceneData == null || sceneData.Count == 0) remoteClient.SendLandStatReply(0, requestFlags, 0, new LandStatReportItem[0]); - Dictionary urlsInUse = null; IUrlModule urlModule = Scene.RequestModuleInterface(); - if(urlModule != null) - urlsInUse = urlModule.GetUrlCountForHosts(); //reformat the name so we don't have to do it on every item bool hasfilter = false; @@ -1477,9 +1474,9 @@ namespace OpenSim.Region.CoreModules.World.Estate continue; int urls_used = 0; - if (urlsInUse != null) + if (urlModule != null) { - urlsInUse.TryGetValue(sop.UUID, out urls_used); + urls_used = urlModule.GetUrlCount(sop.UUID); // Don't show scripts that haven't executed or where execution time is below one microsecond in // order to produce a more readable report. diff --git a/OpenSim/Region/Framework/Interfaces/IUrlModule.cs b/OpenSim/Region/Framework/Interfaces/IUrlModule.cs index ccd0fbe1b3..a6140f41a9 100644 --- a/OpenSim/Region/Framework/Interfaces/IUrlModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IUrlModule.cs @@ -48,5 +48,6 @@ namespace OpenSim.Region.Framework.Interfaces void ScriptRemoved(UUID itemID); void ObjectRemoved(UUID objectID); Dictionary GetUrlCountForHosts(); + int GetUrlCount(UUID host); } }