Merge branch 'ubitwork' of ssh://3dhosting.de/var/git/careminster into ubitwork

avinationmerge
ubit 2012-09-26 04:06:46 +02:00
commit 8346954798
5 changed files with 36 additions and 36 deletions

View File

@ -45,7 +45,8 @@ namespace OpenSim.Framework
/// <summary> /// <summary>
/// Total number of queues (priorities) available /// Total number of queues (priorities) available
/// </summary> /// </summary>
public const uint NumberOfQueues = 12;
public const uint NumberOfQueues = 12; // includes immediate queues, m_queueCounts need to be set acording
/// <summary> /// <summary>
/// Number of queuest (priorities) that are processed immediately /// Number of queuest (priorities) that are processed immediately
@ -60,7 +61,8 @@ namespace OpenSim.Framework
// each pass. weighted towards the higher priority queues // each pass. weighted towards the higher priority queues
private uint m_nextQueue = 0; private uint m_nextQueue = 0;
private uint m_countFromQueue = 0; private uint m_countFromQueue = 0;
private uint[] m_queueCounts = { 8, 4, 4, 2, 2, 2, 2, 1, 1, 1, 1, 1 }; // first queues are imediate, so no counts
private uint[] m_queueCounts = {0, 0, 8, 4, 4, 2, 2, 2, 2, 1, 1, 1};
// next request is a counter of the number of updates queued, it provides // next request is a counter of the number of updates queued, it provides
// a total ordering on the updates coming through the queue and is more // a total ordering on the updates coming through the queue and is more
@ -137,7 +139,7 @@ namespace OpenSim.Framework
/// </summary> /// </summary>
public bool TryDequeue(out IEntityUpdate value, out Int32 timeinqueue) public bool TryDequeue(out IEntityUpdate value, out Int32 timeinqueue)
{ {
// If there is anything in priority queue 0, return it first no // If there is anything in imediate queues, return it first no
// matter what else. Breaks fairness. But very useful. // matter what else. Breaks fairness. But very useful.
for (int iq = 0; iq < NumberOfImmediateQueues; iq++) for (int iq = 0; iq < NumberOfImmediateQueues; iq++)
{ {
@ -172,14 +174,13 @@ namespace OpenSim.Framework
} }
// Find the next non-immediate queue with updates in it // Find the next non-immediate queue with updates in it
for (int i = 0; i < NumberOfQueues; ++i) for (uint i = NumberOfImmediateQueues; i < NumberOfQueues; ++i)
{ {
m_nextQueue = (uint)((m_nextQueue + 1) % NumberOfQueues); m_nextQueue++;
m_countFromQueue = m_queueCounts[m_nextQueue]; if(m_nextQueue >= NumberOfQueues)
m_nextQueue = NumberOfImmediateQueues;
// if this is one of the immediate queues, just skip it m_countFromQueue = m_queueCounts[m_nextQueue];
if (m_nextQueue < NumberOfImmediateQueues)
continue;
if (m_heaps[m_nextQueue].Count > 0) if (m_heaps[m_nextQueue].Count > 0)
{ {
@ -189,7 +190,6 @@ namespace OpenSim.Framework
m_lookupTable.Remove(item.Value.Entity.LocalId); m_lookupTable.Remove(item.Value.Entity.LocalId);
timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime);
value = item.Value; value = item.Value;
return true; return true;
} }
} }

View File

@ -47,6 +47,7 @@ namespace OpenSim.Framework.Servers.HttpServer
public UUID Id; public UUID Id;
public int TimeOutms; public int TimeOutms;
public EventType Type; public EventType Type;
public bool GetEventsNeedsRequest = true;
public enum EventType : int public enum EventType : int
{ {

View File

@ -205,7 +205,7 @@ namespace OpenSim.Framework.Servers.HttpServer
String.Format("PollServiceWorkerThread{0}", i), String.Format("PollServiceWorkerThread{0}", i),
ThreadPriority.Normal, ThreadPriority.Normal,
false, false,
true, false,
null, null,
int.MaxValue); int.MaxValue);
} }
@ -343,36 +343,37 @@ namespace OpenSim.Framework.Servers.HttpServer
try try
{ {
if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id))
{
string strreq = "";
if (req.PollServiceArgs.GetEventsNeedsRequest)
{ {
try try
{ {
str = new StreamReader(req.Request.Body); str = new StreamReader(req.Request.Body);
strreq = str.ReadToEnd();
str.Close();
} }
catch (System.ArgumentException) catch
{ {
// Stream was not readable means a child agent
// was closed due to logout, leaving the
// Event Queue request orphaned.
continue; continue;
} }
}
Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id, strreq);
if (responsedata == null)
continue;
// "Normal" means the viewer evebt queue. We need to push these out fast.
// Process them inline. The rest go to the thread pool.
if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.Normal) if (req.PollServiceArgs.Type == PollServiceEventArgs.EventType.Normal)
{ {
try try
{ {
Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id, str.ReadToEnd());
DoHTTPGruntWork(m_server, req, responsedata); DoHTTPGruntWork(m_server, req, responsedata);
} }
catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
{ {
// Ignore it, no need to reply // Ignore it, no need to reply
} }
finally
{
str.Close();
}
} }
else else
{ {
@ -380,27 +381,19 @@ namespace OpenSim.Framework.Servers.HttpServer
{ {
try try
{ {
Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id, str.ReadToEnd());
DoHTTPGruntWork(m_server, req, responsedata); DoHTTPGruntWork(m_server, req, responsedata);
} }
catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
{ {
// Ignore it, no need to reply // Ignore it, no need to reply
} }
finally
{
str.Close();
}
return null; return null;
}, null); }, null);
} }
} }
else else
{ {
// if ((Environment.TickCount - req.RequestTime) > m_timeout)
if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms)
{ {
DoHTTPGruntWork(m_server, req, DoHTTPGruntWork(m_server, req,

View File

@ -160,7 +160,11 @@ namespace OpenSim.Region.ClientStack.Linden
{ {
m_scene = scene; m_scene = scene;
HasEvents = (x, y) => { lock (responses) return responses.ContainsKey(x); }; HasEvents = (x, y) =>
{
lock (responses)
return responses.ContainsKey(x);
};
GetEvents = (x, y, s) => GetEvents = (x, y, s) =>
{ {
lock (responses) lock (responses)
@ -247,6 +251,7 @@ namespace OpenSim.Region.ClientStack.Linden
PollServiceTextureEventArgs args = new PollServiceTextureEventArgs(agentID, m_scene); PollServiceTextureEventArgs args = new PollServiceTextureEventArgs(agentID, m_scene);
args.Type = PollServiceEventArgs.EventType.Texture; args.Type = PollServiceEventArgs.EventType.Texture;
args.GetEventsNeedsRequest = false;
MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args); MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args);
string hostName = m_scene.RegionInfo.ExternalHostName; string hostName = m_scene.RegionInfo.ExternalHostName;

View File

@ -223,6 +223,7 @@ namespace OpenSim.Region.ClientStack.Linden
PollServiceInventoryEventArgs args = new PollServiceInventoryEventArgs(agentID); PollServiceInventoryEventArgs args = new PollServiceInventoryEventArgs(agentID);
args.Type = PollServiceEventArgs.EventType.Inventory; args.Type = PollServiceEventArgs.EventType.Inventory;
args.GetEventsNeedsRequest = false;
MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args); MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args);
string hostName = m_scene.RegionInfo.ExternalHostName; string hostName = m_scene.RegionInfo.ExternalHostName;