diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index 02cd2997d7..22ac17e53a 100755 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs @@ -98,9 +98,7 @@ namespace OpenSim.Region.ClientStack.Linden private static FetchInvDescHandler m_webFetchHandler; - private static Thread[] m_workerThreads = null; - - private static BlockingCollection m_queue = new BlockingCollection(); + private static ObjectJobEngine m_workerpool = null; private static int m_NumberScenes = 0; @@ -142,12 +140,13 @@ namespace OpenSim.Region.ClientStack.Linden if (!m_Enabled) return; + m_NumberScenes--; + Scene.EventManager.OnRegisterCaps -= RegisterCaps; StatsManager.DeregisterStat(s_processedRequestsStat); StatsManager.DeregisterStat(s_queuedRequestsStat); - m_NumberScenes--; Scene = null; } @@ -181,7 +180,7 @@ namespace OpenSim.Region.ClientStack.Linden "httpfetch", StatType.Pull, MeasuresOfInterest.AverageChangeOverTime, - stat => { stat.Value = m_queue.Count; }, + stat => { stat.Value = m_workerpool.Count; }, StatVerbosity.Debug); StatsManager.RegisterStat(s_processedRequestsStat); @@ -200,22 +199,8 @@ namespace OpenSim.Region.ClientStack.Linden m_NumberScenes++; - int nworkers = 2; // was 2 - if (ProcessQueuedRequestsAsync && m_workerThreads == null) - { - m_workerThreads = new Thread[nworkers]; - - for (uint i = 0; i < nworkers; i++) - { - m_workerThreads[i] = WorkManager.StartThread(DoInventoryRequests, - String.Format("InventoryWorkerThread{0}", i), - ThreadPriority.Normal, - true, - true, - null, - int.MaxValue); - } - } + if (ProcessQueuedRequestsAsync && m_workerpool == null) + m_workerpool = new ObjectJobEngine(DoInventoryRequests, "InventoryWorker",2000,2); } public void PostInitialise() @@ -229,13 +214,10 @@ namespace OpenSim.Region.ClientStack.Linden if (ProcessQueuedRequestsAsync) { - if (m_NumberScenes <= 0 && m_workerThreads != null) + if (m_NumberScenes <= 0 && m_workerpool != null) { - m_log.DebugFormat("[WebFetchInvDescModule] Closing"); - foreach (Thread t in m_workerThreads) - Watchdog.AbortThread(t.ManagedThreadId); - - m_workerThreads = null; + m_workerpool.Dispose(); + m_workerpool = null; m_badRequests.Dispose(); m_badRequests = null; } @@ -303,7 +285,7 @@ namespace OpenSim.Region.ClientStack.Linden reqinfo.thepoll = this; reqinfo.reqID = requestID; reqinfo.request = request; - m_queue.Add(reqinfo); + m_workerpool.Enqueue(reqinfo); return null; }; @@ -399,29 +381,13 @@ namespace OpenSim.Region.ClientStack.Linden } } - private static void DoInventoryRequests() + private static void DoInventoryRequests(object o) { - bool running = true; - while (running) - { - try - { - APollRequest poolreq; - if (m_queue.TryTake(out poolreq, 4500)) - { - Watchdog.UpdateThread(); - if (poolreq.thepoll != null) - poolreq.thepoll.Process(poolreq); - poolreq = null; - } - Watchdog.UpdateThread(); - } - catch (ThreadAbortException) - { - Thread.ResetAbort(); - running = false; - } - } + if(m_NumberScenes <= 0) + return; + APollRequest poolreq = o as APollRequest; + if (poolreq != null && poolreq.thepoll != null) + poolreq.thepoll.Process(poolreq); } } }