diff options
author | UbitUmarov | 2015-08-18 21:03:34 +0100 |
---|---|---|
committer | UbitUmarov | 2015-08-18 21:03:34 +0100 |
commit | 2cac56340a079fad8a16736778b6ebef78fb6d56 (patch) | |
tree | 90cb9963be59cf802d97961abff1dfddaea2a3bd /OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | |
parent | Track selected objects per client (diff) | |
download | opensim-SC-2cac56340a079fad8a16736778b6ebef78fb6d56.zip opensim-SC-2cac56340a079fad8a16736778b6ebef78fb6d56.tar.gz opensim-SC-2cac56340a079fad8a16736778b6ebef78fb6d56.tar.bz2 opensim-SC-2cac56340a079fad8a16736778b6ebef78fb6d56.tar.xz |
try to serialize http requests from same connection, so they are processed
in order. ( next commits will be about necessary keepAlive changes needed)
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index e75b705..2c5c41d 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | |||
@@ -46,6 +46,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
46 | 46 | ||
47 | private readonly BaseHttpServer m_server; | 47 | private readonly BaseHttpServer m_server; |
48 | 48 | ||
49 | private Dictionary<PollServiceHttpRequest, Queue<PollServiceHttpRequest>> m_bycontext; | ||
49 | private BlockingQueue<PollServiceHttpRequest> m_requests = new BlockingQueue<PollServiceHttpRequest>(); | 50 | private BlockingQueue<PollServiceHttpRequest> m_requests = new BlockingQueue<PollServiceHttpRequest>(); |
50 | private static Queue<PollServiceHttpRequest> m_slowRequests = new Queue<PollServiceHttpRequest>(); | 51 | private static Queue<PollServiceHttpRequest> m_slowRequests = new Queue<PollServiceHttpRequest>(); |
51 | private static Queue<PollServiceHttpRequest> m_retryRequests = new Queue<PollServiceHttpRequest>(); | 52 | private static Queue<PollServiceHttpRequest> m_retryRequests = new Queue<PollServiceHttpRequest>(); |
@@ -65,6 +66,9 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
65 | m_WorkerThreadCount = pWorkerThreadCount; | 66 | m_WorkerThreadCount = pWorkerThreadCount; |
66 | m_workerThreads = new Thread[m_WorkerThreadCount]; | 67 | m_workerThreads = new Thread[m_WorkerThreadCount]; |
67 | 68 | ||
69 | PollServiceHttpRequestComparer preqCp = new PollServiceHttpRequestComparer(); | ||
70 | m_bycontext = new Dictionary<PollServiceHttpRequest, Queue<PollServiceHttpRequest>>(preqCp); | ||
71 | |||
68 | STPStartInfo startInfo = new STPStartInfo(); | 72 | STPStartInfo startInfo = new STPStartInfo(); |
69 | startInfo.IdleTimeout = 30000; | 73 | startInfo.IdleTimeout = 30000; |
70 | startInfo.MaxWorkerThreads = 15; | 74 | startInfo.MaxWorkerThreads = 15; |
@@ -114,6 +118,45 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
114 | 118 | ||
115 | public void Enqueue(PollServiceHttpRequest req) | 119 | public void Enqueue(PollServiceHttpRequest req) |
116 | { | 120 | { |
121 | lock (m_bycontext) | ||
122 | { | ||
123 | Queue<PollServiceHttpRequest> ctxQeueue; | ||
124 | if (m_bycontext.TryGetValue(req, out ctxQeueue)) | ||
125 | { | ||
126 | ctxQeueue.Enqueue(req); | ||
127 | } | ||
128 | else | ||
129 | { | ||
130 | ctxQeueue = new Queue<PollServiceHttpRequest>(); | ||
131 | m_bycontext[req] = ctxQeueue; | ||
132 | EnqueueInt(req); | ||
133 | } | ||
134 | } | ||
135 | } | ||
136 | |||
137 | public void byContextDequeue(PollServiceHttpRequest req) | ||
138 | { | ||
139 | Queue<PollServiceHttpRequest> ctxQeueue; | ||
140 | lock (m_bycontext) | ||
141 | { | ||
142 | if (m_bycontext.TryGetValue(req, out ctxQeueue)) | ||
143 | { | ||
144 | if (ctxQeueue.Count > 0) | ||
145 | { | ||
146 | PollServiceHttpRequest newreq = ctxQeueue.Dequeue(); | ||
147 | EnqueueInt(newreq); | ||
148 | } | ||
149 | else | ||
150 | { | ||
151 | m_bycontext.Remove(req); | ||
152 | } | ||
153 | } | ||
154 | } | ||
155 | } | ||
156 | |||
157 | |||
158 | public void EnqueueInt(PollServiceHttpRequest req) | ||
159 | { | ||
117 | if (m_running) | 160 | if (m_running) |
118 | { | 161 | { |
119 | if (req.PollServiceArgs.Type != PollServiceEventArgs.EventType.LongPoll) | 162 | if (req.PollServiceArgs.Type != PollServiceEventArgs.EventType.LongPoll) |
@@ -220,6 +263,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
220 | try | 263 | try |
221 | { | 264 | { |
222 | req.DoHTTPGruntWork(m_server, responsedata); | 265 | req.DoHTTPGruntWork(m_server, responsedata); |
266 | byContextDequeue(req); | ||
223 | } | 267 | } |
224 | catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream | 268 | catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream |
225 | { | 269 | { |
@@ -233,6 +277,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
233 | try | 277 | try |
234 | { | 278 | { |
235 | req.DoHTTPGruntWork(m_server, responsedata); | 279 | req.DoHTTPGruntWork(m_server, responsedata); |
280 | byContextDequeue(req); | ||
236 | } | 281 | } |
237 | catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream | 282 | catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream |
238 | { | 283 | { |
@@ -249,6 +294,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
249 | { | 294 | { |
250 | req.DoHTTPGruntWork(m_server, | 295 | req.DoHTTPGruntWork(m_server, |
251 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | 296 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); |
297 | byContextDequeue(req); | ||
252 | } | 298 | } |
253 | else | 299 | else |
254 | { | 300 | { |