Merging in diva's locking fixes

This commit is contained in:
John Hurliman
2009-10-06 15:54:00 -07:00
12 changed files with 217 additions and 182 deletions

View File

@@ -3546,6 +3546,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
objectData.TextureAnim = textureanim;
}
bool doUpdate = false;
lock (m_primFullUpdates)
{
if (m_primFullUpdates.Count == 0)
@@ -3554,8 +3555,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_primFullUpdates.Add(objectData);
if (m_primFullUpdates.Count >= m_primFullUpdatesPerPacket)
ProcessPrimFullUpdates(this, null);
doUpdate = true;
}
if (doUpdate)
ProcessPrimFullUpdates(this, null);
}
void HandleQueueEmpty(ThrottleOutPacketType queue)
@@ -3576,35 +3579,40 @@ namespace OpenSim.Region.ClientStack.LindenUDP
void ProcessPrimFullUpdates(object sender, ElapsedEventArgs e)
{
bool stopTimer = false;
lock (m_primFullUpdates)
{
if (m_primFullUpdates.Count == 0 && m_primFullUpdateTimer.Enabled)
{
lock (m_primFullUpdateTimer)
m_primFullUpdateTimer.Stop();
stopTimer = true;
}
if (stopTimer)
{
lock (m_primFullUpdateTimer)
m_primFullUpdateTimer.Stop();
return;
}
return;
}
ObjectUpdatePacket outPacket =
(ObjectUpdatePacket)PacketPool.Instance.GetPacket(
PacketType.ObjectUpdate);
ObjectUpdatePacket outPacket =
(ObjectUpdatePacket)PacketPool.Instance.GetPacket(
PacketType.ObjectUpdate);
outPacket.RegionData.RegionHandle =
Scene.RegionInfo.RegionHandle;
outPacket.RegionData.TimeDilation =
(ushort)(Scene.TimeDilation * ushort.MaxValue);
outPacket.RegionData.RegionHandle =
Scene.RegionInfo.RegionHandle;
outPacket.RegionData.TimeDilation =
(ushort)(Scene.TimeDilation * ushort.MaxValue);
int max = m_primFullUpdates.Count;
if (max > m_primFullUpdatesPerPacket)
max = m_primFullUpdatesPerPacket;
int max = m_primFullUpdates.Count;
if (max > m_primFullUpdatesPerPacket)
max = m_primFullUpdatesPerPacket;
int count = 0;
int size = 0;
int count = 0;
int size = 0;
byte[] zerobuffer = new byte[1024];
byte[] blockbuffer = new byte[1024];
byte[] zerobuffer = new byte[1024];
byte[] blockbuffer = new byte[1024];
lock (m_primFullUpdates)
{
for (count = 0 ; count < max ; count++)
{
int length = 0;
@@ -3628,9 +3636,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(outPacket, ThrottleOutPacketType.Task);
if (m_primFullUpdates.Count == 0 && m_primFullUpdateTimer.Enabled)
lock (m_primFullUpdateTimer)
m_primFullUpdateTimer.Stop();
stopTimer = true;
}
if (stopTimer)
lock (m_primFullUpdateTimer)
m_primFullUpdateTimer.Stop();
}
/// <summary>
@@ -3649,6 +3660,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
CreatePrimImprovedBlock(localID, position, rotation,
velocity, rotationalvelocity, state);
bool doUpdate = false;
lock (m_primTerseUpdates)
{
if (m_primTerseUpdates.Count == 0)
@@ -3657,43 +3669,51 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_primTerseUpdates.Add(objectData);
if (m_primTerseUpdates.Count >= m_primTerseUpdatesPerPacket)
ProcessPrimTerseUpdates(this, null);
doUpdate = true;
}
if (doUpdate)
ProcessPrimTerseUpdates(this, null);
}
void ProcessPrimTerseUpdates(object sender, ElapsedEventArgs e)
{
bool stopTimer = false;
lock (m_primTerseUpdates)
{
if (m_primTerseUpdates.Count == 0)
{
lock (m_primTerseUpdateTimer)
m_primTerseUpdateTimer.Stop();
stopTimer = true;
}
if (stopTimer)
{
lock (m_primTerseUpdateTimer)
m_primTerseUpdateTimer.Stop();
return;
}
return;
}
ImprovedTerseObjectUpdatePacket outPacket =
(ImprovedTerseObjectUpdatePacket)
PacketPool.Instance.GetPacket(
PacketType.ImprovedTerseObjectUpdate);
ImprovedTerseObjectUpdatePacket outPacket =
(ImprovedTerseObjectUpdatePacket)
PacketPool.Instance.GetPacket(
PacketType.ImprovedTerseObjectUpdate);
outPacket.RegionData.RegionHandle =
Scene.RegionInfo.RegionHandle;
outPacket.RegionData.TimeDilation =
(ushort)(Scene.TimeDilation * ushort.MaxValue);
outPacket.RegionData.RegionHandle =
Scene.RegionInfo.RegionHandle;
outPacket.RegionData.TimeDilation =
(ushort)(Scene.TimeDilation * ushort.MaxValue);
int max = m_primTerseUpdates.Count;
if (max > m_primTerseUpdatesPerPacket)
max = m_primTerseUpdatesPerPacket;
int max = m_primTerseUpdates.Count;
if (max > m_primTerseUpdatesPerPacket)
max = m_primTerseUpdatesPerPacket;
int count = 0;
int size = 0;
int count = 0;
int size = 0;
byte[] zerobuffer = new byte[1024];
byte[] blockbuffer = new byte[1024];
byte[] zerobuffer = new byte[1024];
byte[] blockbuffer = new byte[1024];
for (count = 0 ; count < max ; count++)
lock (m_primTerseUpdates)
{
for (count = 0; count < max; count++)
{
int length = 0;
m_primTerseUpdates[count].ToBytes(blockbuffer, ref length);
@@ -3718,9 +3738,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(outPacket, ThrottleOutPacketType.Task);
if (m_primTerseUpdates.Count == 0)
lock (m_primTerseUpdateTimer)
m_primTerseUpdateTimer.Stop();
stopTimer = true;
}
if (stopTimer)
lock (m_primTerseUpdateTimer)
m_primTerseUpdateTimer.Stop();
}
public void FlushPrimUpdates()