From 1eb0fedd93b3ff70bb8e04dc2fa8df069b2a91f8 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Wed, 16 Apr 2008 10:54:32 +0000 Subject: 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. --- .../Region/Environment/Scenes/SimStatsReporter.cs | 234 +++++++++++---------- 1 file changed, 118 insertions(+), 116 deletions(-) diff --git a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs index d72bee0..a53bfcd 100644 --- a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs @@ -138,127 +138,129 @@ namespace OpenSim.Region.Environment.Scenes private void statsHeartBeat(object sender, EventArgs e) { - m_report.Enabled = false; - - // Packet is already initialized and ready for data insert - - - statpack.Region = rb; - statpack.Region.RegionX = ReportingRegion.RegionLocX; - statpack.Region.RegionY = ReportingRegion.RegionLocY; - try + // Know what's not thread safe in Mono... modifying timers. + // System.Console.WriteLine("Firing Stats Heart Beat"); + lock (m_report) { - statpack.Region.RegionFlags = (uint) ReportingRegion.EstateSettings.regionFlags; - } - 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 - // 0-50 is pretty close to 0-45 - float simfps = (int) ((m_fps * 5)); - - //if (simfps > 45) - //simfps = simfps - (simfps - 45); - //if (simfps < 0) + // Packet is already initialized and ready for data insert + + + statpack.Region = rb; + statpack.Region.RegionX = ReportingRegion.RegionLocX; + 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; + +#region various statistic googly moogly + + // 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; - - // - float physfps = ((m_pfps / 1000)); - - //if (physfps > 600) + + // + float physfps = ((m_pfps / 1000)); + + //if (physfps > 600) //physfps = physfps - (physfps - 600); - - if (physfps < 0) - physfps = 0; - - #endregion - - //Our time dilation is 0.91 when we're running a full speed, - // therefore to make sure we get an appropriate range, - // 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 - // / 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. - - sb[0].StatID = (uint) Stats.TimeDilation; - sb[0].StatValue = m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); - - sb[1].StatID = (uint) Stats.SimFPS; - sb[1].StatValue = simfps/statsUpdateFactor; - - sb[2].StatID = (uint) Stats.PhysicsFPS; - sb[2].StatValue = physfps / statsUpdateFactor; - - sb[3].StatID = (uint) Stats.AgentUpdates; - sb[3].StatValue = (m_agentUpdates / statsUpdateFactor); - - sb[4].StatID = (uint) Stats.Agents; - sb[4].StatValue = m_rootAgents; - - sb[5].StatID = (uint) Stats.ChildAgents; - sb[5].StatValue = m_childAgents; - - sb[6].StatID = (uint) Stats.TotalPrim; - sb[6].StatValue = m_numPrim; - - sb[7].StatID = (uint) Stats.ActivePrim; - sb[7].StatValue = m_activePrim; - - sb[8].StatID = (uint)Stats.FrameMS; - sb[8].StatValue = m_frameMS / statsUpdateFactor; - - sb[9].StatID = (uint)Stats.NetMS; - sb[9].StatValue = m_netMS / statsUpdateFactor; - - sb[10].StatID = (uint)Stats.PhysicsMS; - sb[10].StatValue = m_physicsMS / statsUpdateFactor; - - sb[11].StatID = (uint)Stats.ImageMS ; - sb[11].StatValue = m_imageMS / statsUpdateFactor; - - sb[12].StatID = (uint)Stats.OtherMS; - sb[12].StatValue = m_otherMS / statsUpdateFactor; - - sb[13].StatID = (uint)Stats.InPacketsPerSecond; - sb[13].StatValue = (m_inPacketsPerSecond); - - sb[14].StatID = (uint)Stats.OutPacketsPerSecond; - sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor); - - sb[15].StatID = (uint)Stats.UnAckedBytes; - sb[15].StatValue = m_unAckedBytes; - - sb[16].StatID = (uint)Stats.AgentMS; - sb[16].StatValue = m_agentMS / statsUpdateFactor; - - sb[17].StatID = (uint)Stats.PendingDownloads; - sb[17].StatValue = m_pendingDownloads; - - sb[18].StatID = (uint)Stats.PendingUploads; - sb[18].StatValue = m_pendingUploads; - - sb[19].StatID = (uint)Stats.ActiveScripts; - sb[19].StatValue = m_activeScripts; - - sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; - sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor; - - statpack.Stat = sb; - - handlerSendStatResult = OnSendStatsResult; - if (handlerSendStatResult != null) - { - handlerSendStatResult(statpack); + + if (physfps < 0) + physfps = 0; + +#endregion + + //Our time dilation is 0.91 when we're running a full speed, + // therefore to make sure we get an appropriate range, + // 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 + // / 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. + + sb[0].StatID = (uint) Stats.TimeDilation; + sb[0].StatValue = m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); + + sb[1].StatID = (uint) Stats.SimFPS; + sb[1].StatValue = simfps/statsUpdateFactor; + + sb[2].StatID = (uint) Stats.PhysicsFPS; + sb[2].StatValue = physfps / statsUpdateFactor; + + sb[3].StatID = (uint) Stats.AgentUpdates; + sb[3].StatValue = (m_agentUpdates / statsUpdateFactor); + + sb[4].StatID = (uint) Stats.Agents; + sb[4].StatValue = m_rootAgents; + + sb[5].StatID = (uint) Stats.ChildAgents; + sb[5].StatValue = m_childAgents; + + sb[6].StatID = (uint) Stats.TotalPrim; + sb[6].StatValue = m_numPrim; + + sb[7].StatID = (uint) Stats.ActivePrim; + sb[7].StatValue = m_activePrim; + + sb[8].StatID = (uint)Stats.FrameMS; + sb[8].StatValue = m_frameMS / statsUpdateFactor; + + sb[9].StatID = (uint)Stats.NetMS; + sb[9].StatValue = m_netMS / statsUpdateFactor; + + sb[10].StatID = (uint)Stats.PhysicsMS; + sb[10].StatValue = m_physicsMS / statsUpdateFactor; + + sb[11].StatID = (uint)Stats.ImageMS ; + sb[11].StatValue = m_imageMS / statsUpdateFactor; + + sb[12].StatID = (uint)Stats.OtherMS; + sb[12].StatValue = m_otherMS / statsUpdateFactor; + + sb[13].StatID = (uint)Stats.InPacketsPerSecond; + sb[13].StatValue = (m_inPacketsPerSecond); + + sb[14].StatID = (uint)Stats.OutPacketsPerSecond; + sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor); + + sb[15].StatID = (uint)Stats.UnAckedBytes; + sb[15].StatValue = m_unAckedBytes; + + sb[16].StatID = (uint)Stats.AgentMS; + sb[16].StatValue = m_agentMS / statsUpdateFactor; + + sb[17].StatID = (uint)Stats.PendingDownloads; + sb[17].StatValue = m_pendingDownloads; + + sb[18].StatID = (uint)Stats.PendingUploads; + sb[18].StatValue = m_pendingUploads; + + sb[19].StatID = (uint)Stats.ActiveScripts; + sb[19].StatValue = m_activeScripts; + + sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; + sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor; + + statpack.Stat = sb; + + handlerSendStatResult = OnSendStatsResult; + if (handlerSendStatResult != null) + { + handlerSendStatResult(statpack); + } + resetvalues(); } - resetvalues(); - m_report.Enabled = true; } - + private void resetvalues() { m_timeDilation = 0; -- cgit v1.1