From 3029080d9b47dca7737675876d79d99eb14e385d Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 27 Nov 2015 07:38:54 +0000 Subject: change threading on GetTexture and getMesh and WebFetch Modules. --- .../Linden/Caps/WebFetchInvDescModule.cs | 68 ++++++++++++---------- 1 file changed, 38 insertions(+), 30 deletions(-) (limited to 'OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs') diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 61f4cd0..83f60c7 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -102,6 +102,8 @@ namespace OpenSim.Region.ClientStack.Linden private static DoubleQueue m_queue = new DoubleQueue(); + private static int m_NumberScenes = 0; + #region ISharedRegionModule Members public WebFetchInvDescModule() : this(true) {} @@ -145,17 +147,7 @@ namespace OpenSim.Region.ClientStack.Linden StatsManager.DeregisterStat(s_processedRequestsStat); StatsManager.DeregisterStat(s_queuedRequestsStat); - if (ProcessQueuedRequestsAsync) - { - if (m_workerThreads != null) - { - foreach (Thread t in m_workerThreads) - Watchdog.AbortThread(t.ManagedThreadId); - - m_workerThreads = null; - } - } - + m_NumberScenes--; Scene = null; } @@ -203,6 +195,8 @@ namespace OpenSim.Region.ClientStack.Linden Scene.EventManager.OnRegisterCaps += RegisterCaps; + m_NumberScenes++; + int nworkers = 2; // was 2 if (ProcessQueuedRequestsAsync && m_workerThreads == null) { @@ -225,7 +219,23 @@ namespace OpenSim.Region.ClientStack.Linden { } - public void Close() { } + public void Close() + { + if (!m_Enabled) + return; + + if (ProcessQueuedRequestsAsync) + { + if (m_NumberScenes <= 0 && m_workerThreads != null) + { + m_log.DebugFormat("[WebFetchInvDescModule] Closing"); + foreach (Thread t in m_workerThreads) + Watchdog.AbortThread(t.ManagedThreadId); + + m_workerThreads = null; + } + } + } public string Name { get { return "WebFetchInvDescModule"; } } @@ -350,6 +360,9 @@ namespace OpenSim.Region.ClientStack.Linden public void Process(aPollRequest requestinfo) { + if(m_module == null || m_module.Scene == null || m_module.Scene.ShuttingDown) + return; + UUID requestID = requestinfo.reqID; Hashtable response = new Hashtable(); @@ -425,31 +438,26 @@ namespace OpenSim.Region.ClientStack.Linden // } // } - private void DoInventoryRequests() + private static void DoInventoryRequests() { while (true) { Watchdog.UpdateThread(); - WaitProcessQueuedInventoryRequest(); - } - } + aPollRequest poolreq = m_queue.Dequeue(); - public void WaitProcessQueuedInventoryRequest() - { - aPollRequest poolreq = m_queue.Dequeue(); - - if (poolreq != null && poolreq.thepoll != null) - { - try + if (poolreq != null && poolreq.thepoll != null) { - poolreq.thepoll.Process(poolreq); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[INVENTORY]: Failed to process queued inventory request {0} for {1} in {2}. Exception {3}", - poolreq.reqID, poolreq.presence != null ? poolreq.presence.Name : "unknown", Scene.Name, e); + try + { + poolreq.thepoll.Process(poolreq); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[INVENTORY]: Failed to process queued inventory request {0} for {1}. Exception {3}", + poolreq.reqID, poolreq.presence != null ? poolreq.presence.Name : "unknown", e); + } } } } -- cgit v1.1