From 6a1d95420d5fd7f083293168c43b4ef5600d9648 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Fri, 3 Apr 2009 20:39:12 +0000 Subject: [PATCH] * Applied r8957 to assist resource monitoring * Applied r8917 to fix some j2k-related issues --- .../Framework/Servers/BaseOpenSimServer.cs | 36 ++++++++ OpenSim/Region/Application/OpenSimBase.cs | 8 ++ .../Agent/TextureSender/J2KDecoderModule.cs | 84 ++++++++++++++++++- bin/OpenSim.ini.example | 3 + 4 files changed, 130 insertions(+), 1 deletion(-) diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs index 8ede8f512c..9794a100c1 100644 --- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs +++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs @@ -73,6 +73,8 @@ namespace OpenSim.Framework.Servers /// protected string m_version; + protected string m_pidFile = String.Empty; + protected BaseHttpServer m_httpServer; public BaseHttpServer HttpServer { @@ -278,6 +280,7 @@ namespace OpenSim.Framework.Servers ShutdownSpecific(); m_log.Info("[SHUTDOWN]: Shutdown processing on main thread complete. Exiting..."); + RemovePIDFile(); Environment.Exit(0); } @@ -433,5 +436,38 @@ namespace OpenSim.Framework.Servers m_version += string.IsNullOrEmpty(buildVersion) ? " " : ("." + buildVersion + " ").Substring(0, 6); } + + protected void CreatePIDFile(string path) + { + try + { + string pidstring = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); + FileStream fs = File.Create(path); + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + Byte[] buf = enc.GetBytes(pidstring); + fs.Write(buf, 0, buf.Length); + fs.Close(); + m_pidFile = path; + } + catch (Exception) + { + } + } + + + protected void RemovePIDFile() + { + if (m_pidFile != String.Empty) + { + try + { + File.Delete(m_pidFile); + m_pidFile = String.Empty; + } + catch (Exception) + { + } + } + } } } diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 32b1258322..bcdfefecff 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -184,6 +184,14 @@ namespace OpenSim /// protected override void StartupSpecific() { + IConfig startupConfig = m_config.Source.Configs["Startup"]; + if (startupConfig != null) + { + string pidFile = startupConfig.GetString("PIDFile", String.Empty); + if (pidFile != String.Empty) + CreatePIDFile(pidFile); + } + base.StartupSpecific(); m_stats = StatsManager.StartCollectingSimExtraStats(); diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs index 3a1d9a31f7..3343204840 100644 --- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs +++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs @@ -211,7 +211,89 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender else { - m_log.WarnFormat("[J2KDecoderModule]: JPEG2000 texture decoding failed for {0}", AssetId); + /* + Random rnd = new Random(); + // scramble ends for test + for (int i = 0; i < texture.LayerInfo.Length; i++) + { + texture.LayerInfo[i].End = rnd.Next(999999); + } + */ + + // Try to do some heuristics error correction! Yeah. + bool sane2Heuristics = true; + + if (texture.LayerInfo.Length == 0) + sane2Heuristics = false; + + if (sane2Heuristics) + { + // Last layer start is less then the end of the file and last layer start is greater then 0 + if (texture.LayerInfo[texture.LayerInfo.Length - 1].Start < texture.AssetData.Length && texture.LayerInfo[texture.LayerInfo.Length - 1].Start > 0) + { + } + else + { + sane2Heuristics = false; + } + + } + + if (sane2Heuristics) + { + int start = 0; + + // try to fix it by using consistant data in the start field + for (int i = 0; i < texture.LayerInfo.Length; i++) + { + if (i == 0) + start = 0; + + if (i == texture.LayerInfo.Length - 1) + texture.LayerInfo[i].End = texture.AssetData.Length; + else + texture.LayerInfo[i].End = texture.LayerInfo[i + 1].Start - 1; + + // in this case, the end of the next packet is less then the start of the last packet + // after we've attempted to fix it which means the start of the last packet is borked + // there's no recovery from this + if (texture.LayerInfo[i].End < start) + { + sane2Heuristics = false; + break; + } + + if (texture.LayerInfo[i].End < 0 || texture.LayerInfo[i].End > texture.AssetData.Length) + { + sane2Heuristics = false; + break; + } + + if (texture.LayerInfo[i].Start < 0 || texture.LayerInfo[i].Start > texture.AssetData.Length) + { + sane2Heuristics = false; + break; + } + + start = texture.LayerInfo[i].Start; + } + } + + if (sane2Heuristics) + { + layers = texture.LayerInfo; + fCache.SaveFileCacheForAsset(AssetId, layers); + + + // Write out decode time + m_log.InfoFormat("[J2KDecoderModule]: HEURISTICS SUCCEEDED {0} Decode Time: {1}", Environment.TickCount - DecodeTime, + AssetId); + + } + else + { + m_log.WarnFormat("[J2KDecoderModule]: JPEG2000 texture decoding failed for {0}", AssetId); + } } texture = null; // dereference and dispose of ManagedImage } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 681f967352..59a32cc064 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -7,6 +7,9 @@ ; (eg default is /opensimdir/crashes/*.txt or C:\opensim\crashes\*.txt) crash_dir = "crashes" + ; Place to create a PID file + ; PIDFile = "/tmp/my.pid" + ; Http proxy support for llHTTPRequest and dynamic texture loading ; Set HttpProxy to the URL for your proxy server if you would like ; to proxy llHTTPRequests through a firewall