There was possible a locking issue in revision 9951 so reverting that revision until further testing can be done.

trunk
MW 2009-07-16 00:05:07 +00:00
parent 5815162d7e
commit 5f68b5b82e
1 changed files with 21 additions and 18 deletions

View File

@ -89,8 +89,7 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_updateflag; private bool m_updateflag;
private byte m_movementflag; private byte m_movementflag;
//private readonly List<NewForce> m_forcesList = new List<NewForce>(); private readonly List<NewForce> m_forcesList = new List<NewForce>();
private NewForce m_nextVelocity = new NewForce();
private short m_updateCount; private short m_updateCount;
private uint m_requestedSitTargetID; private uint m_requestedSitTargetID;
private UUID m_requestedSitTargetUUID = UUID.Zero; private UUID m_requestedSitTargetUUID = UUID.Zero;
@ -139,7 +138,7 @@ namespace OpenSim.Region.Framework.Scenes
public string JID = string.Empty; public string JID = string.Empty;
// Agent moves with a PID controller causing a force to be exerted. // Agent moves with a PID controller causing a force to be exerted.
private bool m_newMovement; private bool m_newForce;
private bool m_newCoarseLocations = true; private bool m_newCoarseLocations = true;
private float m_health = 100f; private float m_health = 100f;
@ -2227,6 +2226,7 @@ namespace OpenSim.Region.Framework.Scenes
m_perfMonMS = Environment.TickCount; m_perfMonMS = Environment.TickCount;
m_rotation = rotation; m_rotation = rotation;
NewForce newVelocity = new NewForce();
Vector3 direc = vec * rotation; Vector3 direc = vec * rotation;
direc.Normalize(); direc.Normalize();
@ -2261,12 +2261,10 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
lock (m_nextVelocity) newVelocity.X = direc.X;
{ newVelocity.Y = direc.Y;
m_nextVelocity.X = direc.X; newVelocity.Z = direc.Z;
m_nextVelocity.Y = direc.Y; m_forcesList.Add(newVelocity);
m_nextVelocity.Z = direc.Z;
}
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
} }
@ -2287,11 +2285,10 @@ namespace OpenSim.Region.Framework.Scenes
if (m_isChildAgent == false) if (m_isChildAgent == false)
{ {
if (m_newMovement) // user movement 'forces' (ie commands to move) if (m_newForce) // user movement 'forces' (ie commands to move)
{ {
SendTerseUpdateToAllClients(); SendTerseUpdateToAllClients();
m_updateCount = 0; m_updateCount = 0;
m_newMovement = false;
} }
else if (m_movementflag != 0) // scripted movement (?) else if (m_movementflag != 0) // scripted movement (?)
{ {
@ -3139,17 +3136,20 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public override void UpdateMovement() public override void UpdateMovement()
{ {
// m_newMovement = false; m_newForce = false;
if ((m_nextVelocity.X != movementvector.X) || (m_nextVelocity.Y != movementvector.Y) || (m_nextVelocity.Z != movementvector.Z)) lock (m_forcesList)
{ {
lock (m_nextVelocity) if (m_forcesList.Count > 0)
{ {
//we are only interested in the last velocity added to the list [Although they are called forces, they are actually velocities]
NewForce force = m_forcesList[m_forcesList.Count - 1];
m_updateflag = true; m_updateflag = true;
try try
{ {
movementvector.X = m_nextVelocity.X; movementvector.X = force.X;
movementvector.Y = m_nextVelocity.Y; movementvector.Y = force.Y;
movementvector.Z = m_nextVelocity.Z; movementvector.Z = force.Z;
Velocity = movementvector; Velocity = movementvector;
} }
catch (NullReferenceException) catch (NullReferenceException)
@ -3158,7 +3158,9 @@ namespace OpenSim.Region.Framework.Scenes
// Ignoring this causes no movement to be sent to the physics engine... // Ignoring this causes no movement to be sent to the physics engine...
// which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter! // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter!
} }
m_newMovement = true; m_newForce = true;
m_forcesList.Clear();
} }
} }
} }
@ -3265,6 +3267,7 @@ 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