diff options
Diffstat (limited to 'OpenSim/Framework')
3 files changed, 77 insertions, 34 deletions
diff --git a/OpenSim/Framework/Console/RemoteConsole.cs b/OpenSim/Framework/Console/RemoteConsole.cs index 8ad7b0d..4b88923 100644 --- a/OpenSim/Framework/Console/RemoteConsole.cs +++ b/OpenSim/Framework/Console/RemoteConsole.cs | |||
@@ -234,7 +234,7 @@ namespace OpenSim.Framework.Console | |||
234 | string uri = "/ReadResponses/" + sessionID.ToString() + "/"; | 234 | string uri = "/ReadResponses/" + sessionID.ToString() + "/"; |
235 | 235 | ||
236 | m_Server.AddPollServiceHTTPHandler( | 236 | m_Server.AddPollServiceHTTPHandler( |
237 | uri, new PollServiceEventArgs(null, uri, HasEvents, GetEvents, NoEvents, sessionID,25000)); // 25 secs timeout | 237 | uri, new PollServiceEventArgs(null, uri, HasEvents, GetEvents, NoEvents, Drop, sessionID, 25000)); // 25 secs timeout |
238 | 238 | ||
239 | XmlDocument xmldoc = new XmlDocument(); | 239 | XmlDocument xmldoc = new XmlDocument(); |
240 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, | 240 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, |
@@ -425,6 +425,15 @@ namespace OpenSim.Framework.Console | |||
425 | return false; | 425 | return false; |
426 | } | 426 | } |
427 | 427 | ||
428 | private void Drop(UUID RequestID, UUID sessionID) | ||
429 | { | ||
430 | lock (m_Connections) | ||
431 | { | ||
432 | if (m_Connections.ContainsKey(sessionID)) | ||
433 | m_Connections.Remove(sessionID); | ||
434 | } | ||
435 | } | ||
436 | |||
428 | private Hashtable GetEvents(UUID RequestID, UUID sessionID) | 437 | private Hashtable GetEvents(UUID RequestID, UUID sessionID) |
429 | { | 438 | { |
430 | ConsoleConnection c = null; | 439 | ConsoleConnection c = null; |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs index 3fd3bf7..a9860cc 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceEventArgs.cs | |||
@@ -37,6 +37,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
37 | public delegate Hashtable GetEventsMethod(UUID requestID, UUID pId); | 37 | public delegate Hashtable GetEventsMethod(UUID requestID, UUID pId); |
38 | 38 | ||
39 | public delegate Hashtable NoEventsMethod(UUID requestID, UUID pId); | 39 | public delegate Hashtable NoEventsMethod(UUID requestID, UUID pId); |
40 | public delegate void DropMethod(UUID requestID, UUID pId); | ||
40 | 41 | ||
41 | public class PollServiceEventArgs : EventArgs | 42 | public class PollServiceEventArgs : EventArgs |
42 | { | 43 | { |
@@ -44,6 +45,7 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
44 | public GetEventsMethod GetEvents; | 45 | public GetEventsMethod GetEvents; |
45 | public NoEventsMethod NoEvents; | 46 | public NoEventsMethod NoEvents; |
46 | public RequestMethod Request; | 47 | public RequestMethod Request; |
48 | public DropMethod Drop; | ||
47 | public UUID Id; | 49 | public UUID Id; |
48 | public int TimeOutms; | 50 | public int TimeOutms; |
49 | public EventType Type; | 51 | public EventType Type; |
@@ -73,13 +75,14 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
73 | RequestMethod pRequest, | 75 | RequestMethod pRequest, |
74 | string pUrl, | 76 | string pUrl, |
75 | HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents, | 77 | HasEventsMethod pHasEvents, GetEventsMethod pGetEvents, NoEventsMethod pNoEvents, |
76 | UUID pId, int pTimeOutms) | 78 | DropMethod pDrop, UUID pId, int pTimeOutms) |
77 | { | 79 | { |
78 | Request = pRequest; | 80 | Request = pRequest; |
79 | Url = pUrl; | 81 | Url = pUrl; |
80 | HasEvents = pHasEvents; | 82 | HasEvents = pHasEvents; |
81 | GetEvents = pGetEvents; | 83 | GetEvents = pGetEvents; |
82 | NoEvents = pNoEvents; | 84 | NoEvents = pNoEvents; |
85 | Drop = pDrop; | ||
83 | Id = pId; | 86 | Id = pId; |
84 | TimeOutms = pTimeOutms; | 87 | TimeOutms = pTimeOutms; |
85 | Type = EventType.LongPoll; | 88 | Type = EventType.LongPoll; |
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs index ffcad0f..5b40590 100644 --- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs +++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs | |||
@@ -160,6 +160,19 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
160 | } | 160 | } |
161 | } | 161 | } |
162 | 162 | ||
163 | public void DropByContext(PollServiceHttpRequest req) | ||
164 | { | ||
165 | Queue<PollServiceHttpRequest> ctxQeueue; | ||
166 | lock (m_bycontext) | ||
167 | { | ||
168 | if (m_bycontext.TryGetValue(req, out ctxQeueue)) | ||
169 | { | ||
170 | ctxQeueue.Clear(); | ||
171 | m_bycontext.Remove(req); | ||
172 | } | ||
173 | } | ||
174 | } | ||
175 | |||
163 | public void EnqueueInt(PollServiceHttpRequest req) | 176 | public void EnqueueInt(PollServiceHttpRequest req) |
164 | { | 177 | { |
165 | if (m_running) | 178 | if (m_running) |
@@ -263,22 +276,61 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
263 | PollServiceHttpRequest req = m_requests.Dequeue(5000); | 276 | PollServiceHttpRequest req = m_requests.Dequeue(5000); |
264 | 277 | ||
265 | Watchdog.UpdateThread(); | 278 | Watchdog.UpdateThread(); |
266 | if (req != null) | 279 | if(req == null) |
280 | continue; | ||
281 | |||
282 | try | ||
267 | { | 283 | { |
268 | try | 284 | if(!req.HttpContext.CanSend()) |
269 | { | 285 | { |
270 | if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) | 286 | req.PollServiceArgs.Drop(req.RequestID, req.PollServiceArgs.Id); |
287 | byContextDequeue(req); | ||
288 | continue; | ||
289 | } | ||
290 | |||
291 | if(req.HttpContext.IsSending()) | ||
292 | { | ||
293 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) | ||
271 | { | 294 | { |
272 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id); | 295 | req.PollServiceArgs.Drop(req.RequestID, req.PollServiceArgs.Id); |
296 | byContextDequeue(req); | ||
297 | } | ||
298 | else | ||
299 | ReQueueEvent(req); | ||
300 | continue; | ||
301 | } | ||
273 | 302 | ||
303 | if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) | ||
304 | { | ||
305 | Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id); | ||
306 | |||
307 | m_threadPool.QueueWorkItem(x => | ||
308 | { | ||
309 | try | ||
310 | { | ||
311 | req.DoHTTPGruntWork(m_server, responsedata); | ||
312 | byContextDequeue(req); | ||
313 | } | ||
314 | catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream | ||
315 | { | ||
316 | // Ignore it, no need to reply | ||
317 | } | ||
318 | return null; | ||
319 | }, null); | ||
320 | } | ||
321 | else | ||
322 | { | ||
323 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) | ||
324 | { | ||
274 | m_threadPool.QueueWorkItem(x => | 325 | m_threadPool.QueueWorkItem(x => |
275 | { | 326 | { |
276 | try | 327 | try |
277 | { | 328 | { |
278 | req.DoHTTPGruntWork(m_server, responsedata); | 329 | req.DoHTTPGruntWork(m_server, |
330 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | ||
279 | byContextDequeue(req); | 331 | byContextDequeue(req); |
280 | } | 332 | } |
281 | catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream | 333 | catch (ObjectDisposedException) |
282 | { | 334 | { |
283 | // Ignore it, no need to reply | 335 | // Ignore it, no need to reply |
284 | } | 336 | } |
@@ -287,36 +339,15 @@ namespace OpenSim.Framework.Servers.HttpServer | |||
287 | } | 339 | } |
288 | else | 340 | else |
289 | { | 341 | { |
290 | if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) | 342 | ReQueueEvent(req); |
291 | { | ||
292 | m_threadPool.QueueWorkItem(x => | ||
293 | { | ||
294 | try | ||
295 | { | ||
296 | req.DoHTTPGruntWork(m_server, | ||
297 | req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id)); | ||
298 | byContextDequeue(req); | ||
299 | } | ||
300 | catch (ObjectDisposedException) | ||
301 | { | ||
302 | // Ignore it, no need to reply | ||
303 | } | ||
304 | return null; | ||
305 | }, null); | ||
306 | } | ||
307 | else | ||
308 | { | ||
309 | ReQueueEvent(req); | ||
310 | } | ||
311 | } | 343 | } |
312 | } | 344 | } |
313 | catch (Exception e) | 345 | } |
314 | { | 346 | catch (Exception e) |
315 | m_log.ErrorFormat("Exception in poll service thread: " + e.ToString()); | 347 | { |
316 | } | 348 | m_log.ErrorFormat("Exception in poll service thread: " + e.ToString()); |
317 | } | 349 | } |
318 | } | 350 | } |
319 | } | 351 | } |
320 | |||
321 | } | 352 | } |
322 | } | 353 | } |