* Rewrote the methods that build ObjectUpdate and ImprovedTerseObjectUpdate packets to fill in the data more accurately and avoid allocating memory that is immediately thrown away
* Changed the Send*Data structs in IClientAPI to use public readonly members instead of private members and getters * Made Parallel.ProcessorCount public * Started switching over packet building methods in LLClientView to use Util.StringToBytes[256/1024]() instead of Utils.StringToBytes() * More cleanup of the ScenePresences vs. ClientManager nightmare * ScenePresence.HandleAgentUpdate() will now time out and drop incoming AgentUpdate packets after three seconds. This fixes a deadlock on m_AgentUpdates that was blocking up the LLUDP serverprioritization
							parent
							
								
									1dbbf6edb6
								
							
						
					
					
						commit
						233e16b99c
					
				|  | @ -999,16 +999,16 @@ namespace OpenSim.Client.MXP.ClientStack | ||||||
|         public void SendAvatarData(SendAvatarData data) |         public void SendAvatarData(SendAvatarData data) | ||||||
|         { |         { | ||||||
|             //ScenePresence presence=((Scene)this.Scene).GetScenePresence(avatarID); |             //ScenePresence presence=((Scene)this.Scene).GetScenePresence(avatarID); | ||||||
|             UUID ownerID = data.avatarID; |             UUID ownerID = data.AvatarID; | ||||||
|             MXPSendAvatarData(data.firstName + " " + data.lastName, ownerID, UUID.Zero, data.avatarID, data.avatarLocalID, data.Pos, data.rotation); |             MXPSendAvatarData(data.FirstName + " " + data.LastName, ownerID, UUID.Zero, data.AvatarID, data.AvatarLocalID, data.Position, data.Rotation); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void SendAvatarTerseUpdate(SendAvatarTerseData data) |         public void SendAvatarTerseUpdate(SendAvatarTerseData data) | ||||||
|         { |         { | ||||||
|             MovementEventMessage me = new MovementEventMessage(); |             MovementEventMessage me = new MovementEventMessage(); | ||||||
|             me.ObjectIndex = data.localID; |             me.ObjectIndex = data.LocalID; | ||||||
|             me.Location = ToOmVector(data.position); |             me.Location = ToOmVector(data.Position); | ||||||
|             me.Orientation = ToOmQuaternion(data.rotation); |             me.Orientation = ToOmQuaternion(data.Rotation); | ||||||
| 
 | 
 | ||||||
|             Session.Send(me); |             Session.Send(me); | ||||||
|         } |         } | ||||||
|  | @ -1030,15 +1030,17 @@ namespace OpenSim.Client.MXP.ClientStack | ||||||
| 
 | 
 | ||||||
|         public void SendPrimitiveToClient(SendPrimitiveData data) |         public void SendPrimitiveToClient(SendPrimitiveData data) | ||||||
|         { |         { | ||||||
|             MXPSendPrimitive(data.localID, data.ownerID, data.acc, data.rvel, data.primShape, data.pos, data.objectID, data.vel, data.rotation, data.flags, data.text, data.color, data.parentID, data.particleSystem, data.clickAction, data.material, data.textureanim); |             MXPSendPrimitive(data.localID, data.ownerID, data.acc, data.rvel, data.primShape, data.pos, data.objectID, data.vel, | ||||||
|  |                 data.rotation, (uint)data.flags, data.text, data.color, data.parentID, data.particleSystem, data.clickAction, | ||||||
|  |                 data.material, data.textureanim); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void SendPrimTerseUpdate(SendPrimitiveTerseData data) |         public void SendPrimTerseUpdate(SendPrimitiveTerseData data) | ||||||
|         { |         { | ||||||
|             MovementEventMessage me = new MovementEventMessage(); |             MovementEventMessage me = new MovementEventMessage(); | ||||||
|             me.ObjectIndex = data.localID; |             me.ObjectIndex = data.LocalID; | ||||||
|             me.Location = ToOmVector(data.position); |             me.Location = ToOmVector(data.Position); | ||||||
|             me.Orientation = ToOmQuaternion(data.rotation); |             me.Orientation = ToOmQuaternion(data.Rotation); | ||||||
|             Session.Send(me); |             Session.Send(me); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -523,124 +523,100 @@ namespace OpenSim.Framework | ||||||
| 
 | 
 | ||||||
|     public struct SendAvatarData |     public struct SendAvatarData | ||||||
|     { |     { | ||||||
|         private ulong m_regionHandle; |         public readonly ulong RegionHandle; | ||||||
|         private string m_firstName; |         public readonly string FirstName; | ||||||
|         private string m_lastName; |         public readonly string LastName; | ||||||
|         private string m_grouptitle; |         public readonly string GroupTitle; | ||||||
|         private UUID m_avatarID; |         public readonly UUID AvatarID; | ||||||
|         private uint m_avatarLocalID; |         public readonly uint AvatarLocalID; | ||||||
|         private Vector3 m_Pos; |         public readonly Vector3 Position; | ||||||
|         private byte[] m_textureEntry; |         public readonly byte[] TextureEntry; | ||||||
|         private uint m_parentID; |         public readonly uint ParentID; | ||||||
|         private Quaternion m_rotation; |         public readonly Quaternion Rotation; | ||||||
| 
 | 
 | ||||||
|         public SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID, |         public SendAvatarData(ulong regionHandle, string firstName, string lastName, string groupTitle, UUID avatarID, | ||||||
|                             uint avatarLocalID, |             uint avatarLocalID, Vector3 position, byte[] textureEntry, uint parentID, Quaternion rotation) | ||||||
|                             Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation) |  | ||||||
|         { |         { | ||||||
|             this.m_regionHandle = regionHandle; |             RegionHandle = regionHandle; | ||||||
|             this.m_firstName = firstName; |             FirstName = firstName; | ||||||
|             this.m_lastName = lastName; |             LastName = lastName; | ||||||
|             this.m_grouptitle = grouptitle; |             GroupTitle = groupTitle; | ||||||
|             this.m_avatarID = avatarID; |             AvatarID = avatarID; | ||||||
|             this.m_avatarLocalID = avatarLocalID; |             AvatarLocalID = avatarLocalID; | ||||||
|             this.m_Pos = Pos; |             Position = position; | ||||||
|             this.m_textureEntry = textureEntry; |             TextureEntry = textureEntry; | ||||||
|             this.m_parentID = parentID; |             ParentID = parentID; | ||||||
|             this.m_rotation = rotation; |             Rotation = rotation; | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         public ulong regionHandle { get { return this.m_regionHandle; } } |  | ||||||
|         public string firstName { get { return this.m_firstName; } } |  | ||||||
|         public string lastName { get { return this.m_lastName; } } |  | ||||||
|         public string grouptitle { get { return this.m_grouptitle; } } |  | ||||||
|         public UUID avatarID { get { return this.m_avatarID; } } |  | ||||||
|         public uint avatarLocalID { get { return this.m_avatarLocalID; } } |  | ||||||
|         public Vector3 Pos { get { return this.m_Pos; } } |  | ||||||
|         public byte[] textureEntry { get { return this.m_textureEntry; } } |  | ||||||
|         public uint parentID { get { return this.m_parentID; } } |  | ||||||
|         public Quaternion rotation { get { return this.m_rotation; } } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public struct SendAvatarTerseData |     public struct SendAvatarTerseData | ||||||
|     { |     { | ||||||
|         private ulong m_regionHandle; |         public readonly ulong RegionHandle; | ||||||
|         private ushort m_timeDilation; |         public readonly ushort TimeDilation; | ||||||
|         private uint m_localID; |         public readonly uint LocalID; | ||||||
|         private Vector3 m_position; |         public readonly Vector3 Position; | ||||||
|         private Vector3 m_velocity; |         public readonly Vector3 Velocity; | ||||||
|         private Quaternion m_rotation; |         public readonly Vector3 Acceleration; | ||||||
|         private UUID m_agentid; |         public readonly Quaternion Rotation; | ||||||
|         private double m_priority; |         public readonly Vector4 CollisionPlane; | ||||||
|  |         public readonly UUID AgentID; | ||||||
|  |         public readonly byte[] TextureEntry; | ||||||
|  |         public readonly double Priority; | ||||||
| 
 | 
 | ||||||
|         public SendAvatarTerseData(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, |         public SendAvatarTerseData(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Vector3 velocity, | ||||||
|                                    Vector3 velocity, Quaternion rotation, UUID agentid, double priority) |             Vector3 acceleration, Quaternion rotation, Vector4 collisionPlane, UUID agentid, byte[] textureEntry, double priority) | ||||||
|         { |         { | ||||||
|             this.m_regionHandle = regionHandle; |             RegionHandle = regionHandle; | ||||||
|             this.m_timeDilation = timeDilation; |             TimeDilation = timeDilation; | ||||||
|             this.m_localID = localID; |             LocalID = localID; | ||||||
|             this.m_position = position; |             Position = position; | ||||||
|             this.m_velocity = velocity; |             Velocity = velocity; | ||||||
|             this.m_rotation = rotation; |             Acceleration = acceleration; | ||||||
|             this.m_agentid = agentid; |             Rotation = rotation; | ||||||
|             this.m_priority = priority; |             CollisionPlane = collisionPlane; | ||||||
|  |             AgentID = agentid; | ||||||
|  |             TextureEntry = textureEntry; | ||||||
|  |             Priority = priority; | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         public ulong regionHandle { get { return this.m_regionHandle; } } |  | ||||||
|         public ushort timeDilation { get { return this.m_timeDilation; } } |  | ||||||
|         public uint localID { get { return this.m_localID; } } |  | ||||||
|         public Vector3 position { get { return this.m_position; } } |  | ||||||
|         public Vector3 velocity { get { return this.m_velocity; } } |  | ||||||
|         public Quaternion rotation { get { return this.m_rotation; } } |  | ||||||
|         public UUID agentid { get { return this.m_agentid; } } |  | ||||||
|         public double priority { get { return this.m_priority; } } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public struct SendPrimitiveTerseData |     public struct SendPrimitiveTerseData | ||||||
|     { |     { | ||||||
|         private ulong m_regionHandle; |         public readonly ulong RegionHandle; | ||||||
|         private ushort m_timeDilation; |         public readonly ushort TimeDilation; | ||||||
|         private uint m_localID; |         public readonly uint LocalID; | ||||||
|         private Vector3 m_position; |         public readonly Vector3 Position; | ||||||
|         private Quaternion m_rotation; |         public readonly Quaternion Rotation; | ||||||
|         private Vector3 m_velocity; |         public readonly Vector3 Velocity; | ||||||
|         private Vector3 m_rotationalvelocity; |         public readonly Vector3 Acceleration; | ||||||
|         private byte m_state; |         public readonly Vector3 AngularVelocity; | ||||||
|         private UUID m_AssetId; |         public readonly byte State; | ||||||
|         private UUID m_owner; |         public readonly UUID AssetID; | ||||||
|         private int m_attachPoint; |         public readonly UUID OwnerID; | ||||||
|         private double m_priority; |         public readonly int AttachPoint; | ||||||
|  |         public readonly byte[] TextureEntry; | ||||||
|  |         public readonly double Priority; | ||||||
| 
 | 
 | ||||||
|         public SendPrimitiveTerseData(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, |         public SendPrimitiveTerseData(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, | ||||||
|                                  Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, |             Quaternion rotation, Vector3 velocity, Vector3 acceleration, Vector3 rotationalvelocity, byte state, | ||||||
|                                  UUID AssetId, UUID owner, int attachPoint, double priority) |             UUID assetID, UUID ownerID, int attachPoint, byte[] textureEntry, double priority) | ||||||
|         { |         { | ||||||
|             this.m_regionHandle = regionHandle; |             RegionHandle = regionHandle; | ||||||
|             this.m_timeDilation = timeDilation; |             TimeDilation = timeDilation; | ||||||
|             this.m_localID = localID; |             LocalID = localID; | ||||||
|             this.m_position = position; |             Position = position; | ||||||
|             this.m_rotation = rotation; |             Rotation = rotation; | ||||||
|             this.m_velocity = velocity; |             Velocity = velocity; | ||||||
|             this.m_rotationalvelocity = rotationalvelocity; |             Acceleration = acceleration; | ||||||
|             this.m_state = state; |             AngularVelocity = rotationalvelocity; | ||||||
|             this.m_AssetId = AssetId; |             State = state; | ||||||
|             this.m_owner = owner; |             AssetID = assetID; | ||||||
|             this.m_attachPoint = attachPoint; |             OwnerID = ownerID; | ||||||
|             this.m_priority = priority; |             AttachPoint = attachPoint; | ||||||
|  |             TextureEntry = textureEntry; | ||||||
|  |             Priority = priority; | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         public ulong regionHandle { get { return this.m_regionHandle; } } |  | ||||||
|         public ushort timeDilation { get { return this.m_timeDilation; } } |  | ||||||
|         public uint localID { get { return this.m_localID; } } |  | ||||||
|         public Vector3 position { get { return this.m_position; } } |  | ||||||
|         public Quaternion rotation { get { return this.m_rotation; } } |  | ||||||
|         public Vector3 velocity { get { return this.m_velocity; } } |  | ||||||
|         public Vector3 rotationalvelocity { get { return this.m_rotationalvelocity; } } |  | ||||||
|         public byte state { get { return this.m_state; } } |  | ||||||
|         public UUID AssetId { get { return this.m_AssetId; } } |  | ||||||
|         public UUID owner { get { return this.m_owner; } } |  | ||||||
|         public int attachPoint { get { return this.m_attachPoint; } } |  | ||||||
|         public double priority { get { return this.m_priority; } } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public struct SendPrimitiveData |     public struct SendPrimitiveData | ||||||
|  | @ -654,7 +630,7 @@ namespace OpenSim.Framework | ||||||
|         private Vector3 m_acc; |         private Vector3 m_acc; | ||||||
|         private Quaternion m_rotation; |         private Quaternion m_rotation; | ||||||
|         private Vector3 m_rvel; |         private Vector3 m_rvel; | ||||||
|         private uint m_flags; |         private PrimFlags m_flags; | ||||||
|         private UUID m_objectID; |         private UUID m_objectID; | ||||||
|         private UUID m_ownerID; |         private UUID m_ownerID; | ||||||
|         private string m_text; |         private string m_text; | ||||||
|  | @ -699,7 +675,7 @@ namespace OpenSim.Framework | ||||||
|             this.m_acc = acc; |             this.m_acc = acc; | ||||||
|             this.m_rotation = rotation; |             this.m_rotation = rotation; | ||||||
|             this.m_rvel = rvel; |             this.m_rvel = rvel; | ||||||
|             this.m_flags = flags; |             this.m_flags = (PrimFlags)flags; | ||||||
|             this.m_objectID = objectID; |             this.m_objectID = objectID; | ||||||
|             this.m_ownerID = ownerID; |             this.m_ownerID = ownerID; | ||||||
|             this.m_text = text; |             this.m_text = text; | ||||||
|  | @ -728,7 +704,7 @@ namespace OpenSim.Framework | ||||||
|         public Vector3 acc { get { return this.m_acc; } } |         public Vector3 acc { get { return this.m_acc; } } | ||||||
|         public Quaternion rotation { get { return this.m_rotation; } } |         public Quaternion rotation { get { return this.m_rotation; } } | ||||||
|         public Vector3 rvel { get { return this.m_rvel; } } |         public Vector3 rvel { get { return this.m_rvel; } } | ||||||
|         public uint flags { get { return this.m_flags; } } |         public PrimFlags flags { get { return this.m_flags; } } | ||||||
|         public UUID objectID { get { return this.m_objectID; } } |         public UUID objectID { get { return this.m_objectID; } } | ||||||
|         public UUID ownerID { get { return this.m_ownerID; } } |         public UUID ownerID { get { return this.m_ownerID; } } | ||||||
|         public string text { get { return this.m_text; } } |         public string text { get { return this.m_text; } } | ||||||
|  |  | ||||||
|  | @ -36,7 +36,7 @@ namespace OpenSim.Framework | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public static class Parallel |     public static class Parallel | ||||||
|     { |     { | ||||||
|         private static readonly int processorCount = System.Environment.ProcessorCount; |         public static readonly int ProcessorCount = System.Environment.ProcessorCount; | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Executes a for loop in which iterations may run in parallel |         /// Executes a for loop in which iterations may run in parallel | ||||||
|  | @ -46,7 +46,7 @@ namespace OpenSim.Framework | ||||||
|         /// <param name="body">Method body to run for each iteration of the loop</param> |         /// <param name="body">Method body to run for each iteration of the loop</param> | ||||||
|         public static void For(int fromInclusive, int toExclusive, Action<int> body) |         public static void For(int fromInclusive, int toExclusive, Action<int> body) | ||||||
|         { |         { | ||||||
|             For(processorCount, fromInclusive, toExclusive, body); |             For(ProcessorCount, fromInclusive, toExclusive, body); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  | @ -103,7 +103,7 @@ namespace OpenSim.Framework | ||||||
|         /// <param name="body">Method body to run for each object in the collection</param> |         /// <param name="body">Method body to run for each object in the collection</param> | ||||||
|         public static void ForEach<T>(IEnumerable<T> enumerable, Action<T> body) |         public static void ForEach<T>(IEnumerable<T> enumerable, Action<T> body) | ||||||
|         { |         { | ||||||
|             ForEach<T>(processorCount, enumerable, body); |             ForEach<T>(ProcessorCount, enumerable, body); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  | @ -161,7 +161,7 @@ namespace OpenSim.Framework | ||||||
|         /// <param name="actions">A series of method bodies to execute</param> |         /// <param name="actions">A series of method bodies to execute</param> | ||||||
|         public static void Invoke(params Action[] actions) |         public static void Invoke(params Action[] actions) | ||||||
|         { |         { | ||||||
|             Invoke(processorCount, actions); |             Invoke(ProcessorCount, actions); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -733,10 +733,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | ||||||
|             // on to en-US to avoid number parsing issues |             // on to en-US to avoid number parsing issues | ||||||
|             Culture.SetCurrentCulture(); |             Culture.SetCurrentCulture(); | ||||||
| 
 | 
 | ||||||
|             IncomingPacket incomingPacket = null; |  | ||||||
| 
 |  | ||||||
|             while (base.IsRunning) |             while (base.IsRunning) | ||||||
|             { |             { | ||||||
|  |                 IncomingPacket incomingPacket = null; | ||||||
|  | 
 | ||||||
|                 try |                 try | ||||||
|                 { |                 { | ||||||
|                     if (packetInbox.Dequeue(100, ref incomingPacket)) |                     if (packetInbox.Dequeue(100, ref incomingPacket)) | ||||||
|  |  | ||||||
|  | @ -357,13 +357,6 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             get { return m_defaultScriptEngine; } |             get { return m_defaultScriptEngine; } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // Reference to all of the agents in the scene (root and child) |  | ||||||
|         protected Dictionary<UUID, ScenePresence> m_scenePresences |  | ||||||
|         { |  | ||||||
|             get { return m_sceneGraph.ScenePresences; } |  | ||||||
|             set { m_sceneGraph.ScenePresences = value; } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public EntityManager Entities |         public EntityManager Entities | ||||||
|         { |         { | ||||||
|             get { return m_sceneGraph.Entities; } |             get { return m_sceneGraph.Entities; } | ||||||
|  | @ -1183,14 +1176,13 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         /// <param name="stats">Stats on the Simulator's performance</param> |         /// <param name="stats">Stats on the Simulator's performance</param> | ||||||
|         private void SendSimStatsPackets(SimStats stats) |         private void SendSimStatsPackets(SimStats stats) | ||||||
|         { |         { | ||||||
|             List<ScenePresence> StatSendAgents = GetScenePresences(); |             ForEachScenePresence( | ||||||
|             foreach (ScenePresence agent in StatSendAgents) |                 delegate(ScenePresence agent) | ||||||
|             { |  | ||||||
|                 if (!agent.IsChildAgent) |  | ||||||
|                 { |                 { | ||||||
|                     agent.ControllingClient.SendSimStats(stats); |                     if (!agent.IsChildAgent) | ||||||
|  |                         agent.ControllingClient.SendSimStats(stats); | ||||||
|                 } |                 } | ||||||
|             } |             ); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|  | @ -3501,10 +3493,8 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         { |         { | ||||||
|             ScenePresence presence; |             ScenePresence presence; | ||||||
| 
 | 
 | ||||||
|             lock (m_scenePresences) |             lock (m_sceneGraph.ScenePresences) | ||||||
|             { |                 m_sceneGraph.ScenePresences.TryGetValue(agentID, out presence); | ||||||
|                 m_scenePresences.TryGetValue(agentID, out presence); |  | ||||||
|             } |  | ||||||
| 
 | 
 | ||||||
|             if (presence != null) |             if (presence != null) | ||||||
|             { |             { | ||||||
|  | @ -3714,12 +3704,9 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, Vector3 position, |         public void RequestTeleportLocation(IClientAPI remoteClient, ulong regionHandle, Vector3 position, | ||||||
|                                             Vector3 lookAt, uint teleportFlags) |                                             Vector3 lookAt, uint teleportFlags) | ||||||
|         { |         { | ||||||
|             ScenePresence sp = null; |             ScenePresence sp; | ||||||
|             lock (m_scenePresences) |             lock (m_sceneGraph.ScenePresences) | ||||||
|             { |                 m_sceneGraph.ScenePresences.TryGetValue(remoteClient.AgentId, out sp); | ||||||
|                 if (m_scenePresences.ContainsKey(remoteClient.AgentId)) |  | ||||||
|                     sp = m_scenePresences[remoteClient.AgentId]; |  | ||||||
|             } |  | ||||||
| 
 | 
 | ||||||
|             if (sp != null) |             if (sp != null) | ||||||
|             { |             { | ||||||
|  | @ -4168,7 +4155,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         public void ForEachScenePresence(Action<ScenePresence> action) |         public void ForEachScenePresence(Action<ScenePresence> action) | ||||||
|         { |         { | ||||||
|             // We don't want to try to send messages if there are no avatars. |             // We don't want to try to send messages if there are no avatars. | ||||||
|             if (m_scenePresences != null) |             if (m_sceneGraph != null && m_sceneGraph.ScenePresences != null) | ||||||
|             { |             { | ||||||
|                 try |                 try | ||||||
|                 { |                 { | ||||||
|  |  | ||||||
|  | @ -3791,15 +3791,15 @@ if (m_shape != null) { | ||||||
|                 if (ParentGroup.RootPart == this) |                 if (ParentGroup.RootPart == this) | ||||||
|                     lPos = AbsolutePosition; |                     lPos = AbsolutePosition; | ||||||
|             } |             } | ||||||
| 
 |              | ||||||
|             // Causes this thread to dig into the Client Thread Data. |             // Causes this thread to dig into the Client Thread Data. | ||||||
|             // Remember your locking here! |             // Remember your locking here! | ||||||
|             remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle, |             remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle, | ||||||
|                     (ushort)(m_parentGroup.GetTimeDilation() * |                     (ushort)(m_parentGroup.GetTimeDilation() * | ||||||
|                     (float)ushort.MaxValue), LocalId, lPos, |                     (float)ushort.MaxValue), LocalId, lPos, | ||||||
|                     RotationOffset, Velocity, |                     RotationOffset, Velocity, Acceleration, | ||||||
|                     RotationalVelocity, state, FromItemID, |                     RotationalVelocity, state, FromItemID, | ||||||
|                     OwnerID, (int)AttachmentPoint, ParentGroup.GetUpdatePriority(remoteClient))); |                     OwnerID, (int)AttachmentPoint, null, ParentGroup.GetUpdatePriority(remoteClient))); | ||||||
|         } |         } | ||||||
|                  |                  | ||||||
|         public void AddScriptLPS(int count) |         public void AddScriptLPS(int count) | ||||||
|  |  | ||||||
|  | @ -1160,15 +1160,21 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) |         public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) | ||||||
|         { |         { | ||||||
|             lock (m_agentUpdates) |             const int AGENT_UPDATE_TIMEOUT_MS = 1000 * 3; | ||||||
|  | 
 | ||||||
|  |             if (System.Threading.Monitor.TryEnter(m_agentUpdates, AGENT_UPDATE_TIMEOUT_MS)) | ||||||
|             { |             { | ||||||
|                 if (m_updatesAllowed) |                 try | ||||||
|                 { |                 { | ||||||
|                     RealHandleAgentUpdate(remoteClient, agentData); |                     if (m_updatesAllowed) | ||||||
|                     return; |                     { | ||||||
|  |                         RealHandleAgentUpdate(remoteClient, agentData); | ||||||
|  |                         return; | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                     m_agentUpdates.Add(agentData); | ||||||
|                 } |                 } | ||||||
|                  |                 finally { System.Threading.Monitor.Exit(m_agentUpdates); } | ||||||
|                 m_agentUpdates.Add(agentData); |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -2471,7 +2477,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 pos.Z -= m_appearance.HipOffset; |                 pos.Z -= m_appearance.HipOffset; | ||||||
| 
 | 
 | ||||||
|                 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, |                 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, | ||||||
|                     pos, m_velocity, m_rotation, m_uuid, GetUpdatePriority(remoteClient))); |                     pos, m_velocity, Vector3.Zero, m_rotation, Vector4.Zero, m_uuid, null, GetUpdatePriority(remoteClient))); | ||||||
| 
 | 
 | ||||||
|                 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); |                 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); | ||||||
|                 m_scene.StatsReporter.AddAgentUpdates(1); |                 m_scene.StatsReporter.AddAgentUpdates(1); | ||||||
|  | @ -3504,7 +3510,6 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
| 
 | 
 | ||||||
|         public void Close() |         public void Close() | ||||||
|         { |         { | ||||||
| 
 |  | ||||||
|             lock (m_attachments) |             lock (m_attachments) | ||||||
|             { |             { | ||||||
|                 // Delete attachments from scene |                 // Delete attachments from scene | ||||||
|  | @ -3535,7 +3540,6 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             m_sceneViewer.Close(); |             m_sceneViewer.Close(); | ||||||
| 
 | 
 | ||||||
|             RemoveFromPhysicalScene(); |             RemoveFromPhysicalScene(); | ||||||
|             GC.Collect(); |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public ScenePresence() |         public ScenePresence() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 John Hurliman
						John Hurliman