After reading Timer.cs in the mono source, I'm not

convinced that timer.Enabled modification is thread safe.
I suspect the statsHeartBeat call to be one of our hot spots
because is tries to synchronize not with a lock, but by
disabling and enabling itself.  I've replaced that with a lock
in the hopes that this affects either the 100% bug, or the
invoke_void bugs.
0.6.0-stable
Sean Dague 2008-04-16 10:54:32 +00:00
parent ebb4ac6853
commit 1eb0fedd93
1 changed files with 117 additions and 115 deletions

View File

@ -138,125 +138,127 @@ namespace OpenSim.Region.Environment.Scenes
private void statsHeartBeat(object sender, EventArgs e) private void statsHeartBeat(object sender, EventArgs e)
{ {
m_report.Enabled = false; // Know what's not thread safe in Mono... modifying timers.
// System.Console.WriteLine("Firing Stats Heart Beat");
// Packet is already initialized and ready for data insert lock (m_report)
statpack.Region = rb;
statpack.Region.RegionX = ReportingRegion.RegionLocX;
statpack.Region.RegionY = ReportingRegion.RegionLocY;
try
{ {
statpack.Region.RegionFlags = (uint) ReportingRegion.EstateSettings.regionFlags; // Packet is already initialized and ready for data insert
}
catch (Exception)
{
statpack.Region.RegionFlags = (uint) 0;
}
statpack.Region.ObjectCapacity = (uint) objectCapacity;
#region various statistic googly moogly
// Our FPS is actually 10fps, so multiplying by 5 to get the amount that people expect there statpack.Region = rb;
// 0-50 is pretty close to 0-45 statpack.Region.RegionX = ReportingRegion.RegionLocX;
float simfps = (int) ((m_fps * 5)); statpack.Region.RegionY = ReportingRegion.RegionLocY;
try
{
statpack.Region.RegionFlags = (uint) ReportingRegion.EstateSettings.regionFlags;
}
catch (Exception)
{
statpack.Region.RegionFlags = (uint) 0;
}
statpack.Region.ObjectCapacity = (uint) objectCapacity;
//if (simfps > 45) #region various statistic googly moogly
//simfps = simfps - (simfps - 45);
//if (simfps < 0) // Our FPS is actually 10fps, so multiplying by 5 to get the amount that people expect there
// 0-50 is pretty close to 0-45
float simfps = (int) ((m_fps * 5));
//if (simfps > 45)
//simfps = simfps - (simfps - 45);
//if (simfps < 0)
//simfps = 0; //simfps = 0;
// //
float physfps = ((m_pfps / 1000)); float physfps = ((m_pfps / 1000));
//if (physfps > 600) //if (physfps > 600)
//physfps = physfps - (physfps - 600); //physfps = physfps - (physfps - 600);
if (physfps < 0) if (physfps < 0)
physfps = 0; physfps = 0;
#endregion #endregion
//Our time dilation is 0.91 when we're running a full speed, //Our time dilation is 0.91 when we're running a full speed,
// therefore to make sure we get an appropriate range, // therefore to make sure we get an appropriate range,
// we have to factor in our error. (0.10f * statsUpdateFactor) // we have to factor in our error. (0.10f * statsUpdateFactor)
// multiplies the fix for the error times the amount of times it'll occur a second // multiplies the fix for the error times the amount of times it'll occur a second
// / 10 divides the value by the number of times the sim heartbeat runs (10fps) // / 10 divides the value by the number of times the sim heartbeat runs (10fps)
// Then we divide the whole amount by the amount of seconds pass in between stats updates. // Then we divide the whole amount by the amount of seconds pass in between stats updates.
sb[0].StatID = (uint) Stats.TimeDilation; sb[0].StatID = (uint) Stats.TimeDilation;
sb[0].StatValue = m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); sb[0].StatValue = m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor));
sb[1].StatID = (uint) Stats.SimFPS; sb[1].StatID = (uint) Stats.SimFPS;
sb[1].StatValue = simfps/statsUpdateFactor; sb[1].StatValue = simfps/statsUpdateFactor;
sb[2].StatID = (uint) Stats.PhysicsFPS; sb[2].StatID = (uint) Stats.PhysicsFPS;
sb[2].StatValue = physfps / statsUpdateFactor; sb[2].StatValue = physfps / statsUpdateFactor;
sb[3].StatID = (uint) Stats.AgentUpdates; sb[3].StatID = (uint) Stats.AgentUpdates;
sb[3].StatValue = (m_agentUpdates / statsUpdateFactor); sb[3].StatValue = (m_agentUpdates / statsUpdateFactor);
sb[4].StatID = (uint) Stats.Agents; sb[4].StatID = (uint) Stats.Agents;
sb[4].StatValue = m_rootAgents; sb[4].StatValue = m_rootAgents;
sb[5].StatID = (uint) Stats.ChildAgents; sb[5].StatID = (uint) Stats.ChildAgents;
sb[5].StatValue = m_childAgents; sb[5].StatValue = m_childAgents;
sb[6].StatID = (uint) Stats.TotalPrim; sb[6].StatID = (uint) Stats.TotalPrim;
sb[6].StatValue = m_numPrim; sb[6].StatValue = m_numPrim;
sb[7].StatID = (uint) Stats.ActivePrim; sb[7].StatID = (uint) Stats.ActivePrim;
sb[7].StatValue = m_activePrim; sb[7].StatValue = m_activePrim;
sb[8].StatID = (uint)Stats.FrameMS; sb[8].StatID = (uint)Stats.FrameMS;
sb[8].StatValue = m_frameMS / statsUpdateFactor; sb[8].StatValue = m_frameMS / statsUpdateFactor;
sb[9].StatID = (uint)Stats.NetMS; sb[9].StatID = (uint)Stats.NetMS;
sb[9].StatValue = m_netMS / statsUpdateFactor; sb[9].StatValue = m_netMS / statsUpdateFactor;
sb[10].StatID = (uint)Stats.PhysicsMS; sb[10].StatID = (uint)Stats.PhysicsMS;
sb[10].StatValue = m_physicsMS / statsUpdateFactor; sb[10].StatValue = m_physicsMS / statsUpdateFactor;
sb[11].StatID = (uint)Stats.ImageMS ; sb[11].StatID = (uint)Stats.ImageMS ;
sb[11].StatValue = m_imageMS / statsUpdateFactor; sb[11].StatValue = m_imageMS / statsUpdateFactor;
sb[12].StatID = (uint)Stats.OtherMS; sb[12].StatID = (uint)Stats.OtherMS;
sb[12].StatValue = m_otherMS / statsUpdateFactor; sb[12].StatValue = m_otherMS / statsUpdateFactor;
sb[13].StatID = (uint)Stats.InPacketsPerSecond; sb[13].StatID = (uint)Stats.InPacketsPerSecond;
sb[13].StatValue = (m_inPacketsPerSecond); sb[13].StatValue = (m_inPacketsPerSecond);
sb[14].StatID = (uint)Stats.OutPacketsPerSecond; sb[14].StatID = (uint)Stats.OutPacketsPerSecond;
sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor); sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor);
sb[15].StatID = (uint)Stats.UnAckedBytes; sb[15].StatID = (uint)Stats.UnAckedBytes;
sb[15].StatValue = m_unAckedBytes; sb[15].StatValue = m_unAckedBytes;
sb[16].StatID = (uint)Stats.AgentMS; sb[16].StatID = (uint)Stats.AgentMS;
sb[16].StatValue = m_agentMS / statsUpdateFactor; sb[16].StatValue = m_agentMS / statsUpdateFactor;
sb[17].StatID = (uint)Stats.PendingDownloads; sb[17].StatID = (uint)Stats.PendingDownloads;
sb[17].StatValue = m_pendingDownloads; sb[17].StatValue = m_pendingDownloads;
sb[18].StatID = (uint)Stats.PendingUploads; sb[18].StatID = (uint)Stats.PendingUploads;
sb[18].StatValue = m_pendingUploads; sb[18].StatValue = m_pendingUploads;
sb[19].StatID = (uint)Stats.ActiveScripts; sb[19].StatID = (uint)Stats.ActiveScripts;
sb[19].StatValue = m_activeScripts; sb[19].StatValue = m_activeScripts;
sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; sb[20].StatID = (uint)Stats.ScriptLinesPerSecond;
sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor; sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor;
statpack.Stat = sb; statpack.Stat = sb;
handlerSendStatResult = OnSendStatsResult; handlerSendStatResult = OnSendStatsResult;
if (handlerSendStatResult != null) if (handlerSendStatResult != null)
{ {
handlerSendStatResult(statpack); handlerSendStatResult(statpack);
}
resetvalues();
} }
resetvalues();
m_report.Enabled = true;
} }
private void resetvalues() private void resetvalues()