replace some locked objects by .net4.0 concurrent objects

httptests
UbitUmarov 2017-06-10 04:18:31 +01:00
parent b5910cfdb7
commit 73aa752034
1 changed files with 32 additions and 30 deletions

View File

@ -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<PollServiceHttpRequest, Queue<PollServiceHttpRequest>> m_bycontext;
private BlockingQueue<PollServiceHttpRequest> m_requests = new BlockingQueue<PollServiceHttpRequest>();
private static Queue<PollServiceHttpRequest> m_retryRequests = new Queue<PollServiceHttpRequest>();
private ConcurrentDictionary <PollServiceHttpRequest,ConcurrentQueue<PollServiceHttpRequest>> m_bycontext;
private BlockingCollection<PollServiceHttpRequest> m_requests = new BlockingCollection<PollServiceHttpRequest>();
private static ConcurrentQueue<PollServiceHttpRequest> m_retryRequests = new ConcurrentQueue<PollServiceHttpRequest>();
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<PollServiceHttpRequest, Queue<PollServiceHttpRequest>>(preqCp);
m_bycontext = new ConcurrentDictionary <PollServiceHttpRequest, ConcurrentQueue<PollServiceHttpRequest>>(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<PollServiceHttpRequest> ctxQeueue;
ConcurrentQueue<PollServiceHttpRequest> ctxQeueue;
if (m_bycontext.TryGetValue(req, out ctxQeueue))
{
ctxQeueue.Enqueue(req);
}
else
{
ctxQeueue = new Queue<PollServiceHttpRequest>();
ctxQeueue = new ConcurrentQueue<PollServiceHttpRequest>();
m_bycontext[req] = ctxQeueue;
EnqueueInt(req);
}
@ -138,19 +138,20 @@ namespace OpenSim.Framework.Servers.HttpServer
public void byContextDequeue(PollServiceHttpRequest req)
{
Queue<PollServiceHttpRequest> ctxQeueue;
lock (m_bycontext)
ConcurrentQueue<PollServiceHttpRequest> 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<PollServiceHttpRequest> ctxQeueue;
ConcurrentQueue<PollServiceHttpRequest> 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<PollServiceHttpRequest> qu in m_bycontext.Values)
qu.Clear();
// foreach (Queue<PollServiceHttpRequest> 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;