From 73aa7520341fec13416661f19ea19cf138b6386d Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 10 Jun 2017 04:18:31 +0100 Subject: replace some locked objects by .net4.0 concurrent objects --- .../HttpServer/PollServiceRequestManager.cs | 62 +++++++++++----------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index cbdd781..9115b62 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs @@ -27,6 +27,7 @@ using System; using System.Collections; +using System.Collections.Concurrent; using System.Threading; using System.Reflection; using log4net; @@ -46,10 +47,9 @@ namespace OpenSim.Framework.Servers.HttpServer private readonly BaseHttpServer m_server; - private Dictionary> m_bycontext; - private BlockingQueue m_requests = new BlockingQueue(); - private static Queue m_retryRequests = new Queue(); - + private ConcurrentDictionary > m_bycontext; + private BlockingCollection m_requests = new BlockingCollection(); + private static ConcurrentQueue m_retryRequests = new ConcurrentQueue(); private uint m_WorkerThreadCount = 0; private Thread[] m_workerThreads; private Thread m_retrysThread; @@ -66,7 +66,7 @@ namespace OpenSim.Framework.Servers.HttpServer m_workerThreads = new Thread[m_WorkerThreadCount]; PollServiceHttpRequestComparer preqCp = new PollServiceHttpRequestComparer(); - m_bycontext = new Dictionary>(preqCp); + m_bycontext = new ConcurrentDictionary >(preqCp); STPStartInfo startInfo = new STPStartInfo(); startInfo.IdleTimeout = 30000; @@ -113,23 +113,23 @@ namespace OpenSim.Framework.Servers.HttpServer { if (m_running) { - lock (m_retryRequests) +// lock (m_retryRequests) m_retryRequests.Enqueue(req); } } public void Enqueue(PollServiceHttpRequest req) { - lock (m_bycontext) +// lock (m_bycontext) { - Queue ctxQeueue; + ConcurrentQueue ctxQeueue; if (m_bycontext.TryGetValue(req, out ctxQeueue)) { ctxQeueue.Enqueue(req); } else { - ctxQeueue = new Queue(); + ctxQeueue = new ConcurrentQueue(); m_bycontext[req] = ctxQeueue; EnqueueInt(req); } @@ -138,19 +138,20 @@ namespace OpenSim.Framework.Servers.HttpServer public void byContextDequeue(PollServiceHttpRequest req) { - Queue ctxQeueue; - lock (m_bycontext) + ConcurrentQueue ctxQeueue; +// lock (m_bycontext) { if (m_bycontext.TryGetValue(req, out ctxQeueue)) { - if (ctxQeueue.Count > 0) + if (!ctxQeueue.IsEmpty) { - PollServiceHttpRequest newreq = ctxQeueue.Dequeue(); - EnqueueInt(newreq); + PollServiceHttpRequest newreq; + if(ctxQeueue.TryDequeue(out newreq)) + EnqueueInt(newreq); } else { - m_bycontext.Remove(req); + m_bycontext.TryRemove(req, out ctxQeueue); } } } @@ -158,13 +159,13 @@ namespace OpenSim.Framework.Servers.HttpServer public void DropByContext(PollServiceHttpRequest req) { - Queue ctxQeueue; + ConcurrentQueue ctxQeueue; lock (m_bycontext) { - if (m_bycontext.TryGetValue(req, out ctxQeueue)) + if (m_bycontext.ContainsKey(req)) { - ctxQeueue.Clear(); - m_bycontext.Remove(req); +// ctxQeueue.Clear(); + m_bycontext.TryRemove(req, out ctxQeueue); } } } @@ -172,20 +173,21 @@ namespace OpenSim.Framework.Servers.HttpServer public void EnqueueInt(PollServiceHttpRequest req) { if (m_running) - m_requests.Enqueue(req); + m_requests.Add(req); } private void CheckRetries() { + PollServiceHttpRequest req; while (m_running) - { Thread.Sleep(100); // let the world move .. back to faster rate Watchdog.UpdateThread(); - lock (m_retryRequests) +// lock (m_retryRequests) { while (m_retryRequests.Count > 0 && m_running) - m_requests.Enqueue(m_retryRequests.Dequeue()); + if(m_retryRequests.TryDequeue(out req)) + m_requests.Add(req); } } } @@ -203,8 +205,8 @@ namespace OpenSim.Framework.Servers.HttpServer // any entry in m_bycontext should have a active request on the other queues // so just delete contents to easy GC - foreach (Queue qu in m_bycontext.Values) - qu.Clear(); +// foreach (Queue qu in m_bycontext.Values) +// qu.Clear(); m_bycontext.Clear(); try @@ -220,13 +222,13 @@ namespace OpenSim.Framework.Servers.HttpServer PollServiceHttpRequest wreq; - m_retryRequests.Clear(); +// m_retryRequests.Clear(); - while (m_requests.Count() > 0) + while (m_requests.Count > 0) { try { - wreq = m_requests.Dequeue(0); + wreq = m_requests.Take(); wreq.DoHTTPstop(m_server); } catch @@ -234,7 +236,7 @@ namespace OpenSim.Framework.Servers.HttpServer } } - m_requests.Clear(); +// m_requests.Clear(); } // work threads @@ -243,7 +245,7 @@ namespace OpenSim.Framework.Servers.HttpServer { while (m_running) { - PollServiceHttpRequest req = m_requests.Dequeue(4500); + PollServiceHttpRequest req = m_requests.Take(); Watchdog.UpdateThread(); if(req == null) continue; -- cgit v1.1